xpath.c revision ab4e2e90f63db6b1cd8bb2e453cac899ef43d42b
1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xpath.c: XML Path Language implementation 3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XPath is a language for addressing parts of an XML document, 4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * designed to be used by both XSLT and XPointer 5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *f 6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reference: W3C Recommendation 16 November 1999 7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://www.w3.org/TR/1999/REC-xpath-19991116 8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Public reference: 9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://www.w3.org/TR/xpath 10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See Copyright for the status of this software 12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Author: daniel@veillard.com 14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IN_LIBXML 18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "libxml.h" 19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h> 21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_SYS_TYPES_H 23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <sys/types.h> 24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_MATH_H 26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <math.h> 27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_FLOAT_H 29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <float.h> 30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_CTYPE_H 32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <ctype.h> 33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_SIGNAL_H 35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <signal.h> 36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlmemory.h> 39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/tree.h> 40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/valid.h> 41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xpath.h> 42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xpathInternals.h> 43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parserInternals.h> 44ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/hash.h> 45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xpointer.h> 47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DEBUG_ENABLED 49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/debugXML.h> 50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlerror.h> 52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/threads.h> 53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/globals.h> 54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_PATTERN_ENABLED 55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/pattern.h> 56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_PATTERN_ENABLED 59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XPATH_STREAMING 60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define TODO \ 63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, \ 64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unimplemented block at %s:%d\n", \ 65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __FILE__, __LINE__); 66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* XP_OPTIMIZED_NON_ELEM_COMPARISON: 69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* If defined, this will use xmlXPathCmpNodesExt() instead of 70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* xmlXPathCmpNodes(). The new function is optimized comparison of 71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* non-element nodes; actually it will speed up comparison only if 72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* xmlXPathOrderDocElems() was called in order to index the elements of 73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* a tree in document order; Libxslt does such an indexing, thus it will 74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* benefit from this optimization. 75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/ 76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_OPTIMIZED_NON_ELEM_COMPARISON 77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* XP_OPTIMIZED_FILTER_FIRST: 80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* If defined, this will optimize expressions like "key('foo', 'val')[b][1]" 81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* in a way, that it stop evaluation at the first node. 82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/ 83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_OPTIMIZED_FILTER_FIRST 84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* XP_DEBUG_OBJ_USAGE: 87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Internal flag to enable tracking of how much XPath objects have been 88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* created. 89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/ 90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define XP_DEBUG_OBJ_USAGE */ 91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: 94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * There are a few spots where some tests are done which depend upon ascii 95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * data. These should be enhanced for full UTF8 support (see particularly 96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * any use of the macros IS_ASCII_CHARACTER and IS_ASCII_DIGIT) 97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) 100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Floating point stuff * 104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef TRIO_REPLACE_STDIO 108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define TRIO_PUBLIC static 109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "trionan.c" 111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The lack of portability of this section of the libc is annoying ! 114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble xmlXPathNAN = 0; 116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble xmlXPathPINF = 1; 117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble xmlXPathNINF = -1; 118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic double xmlXPathNZERO = 0; /* not exported from headers */ 119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathInitialized = 0; 120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathInit: 123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initialize the XPath environment 125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathInit(void) { 128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathInitialized) return; 129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathPINF = trio_pinf(); 131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNINF = trio_ninf(); 132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNAN = trio_nan(); 133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNZERO = trio_nzero(); 134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathInitialized = 1; 136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIsNaN: 140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: a double value 141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Provides a portable isnan() function to detect whether a double 143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is a NotaNumber. Based on trio code 144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://sourceforge.net/projects/ctrio/ 145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the value is a NaN, 0 otherwise 147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIsNaN(double val) { 150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(trio_isnan(val)); 151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIsInf: 155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: a double value 156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Provides a portable isinf() function to detect whether a double 158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is a +Infinite or -Infinite. Based on trio code 159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://sourceforge.net/projects/ctrio/ 160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 vi the value is +Infinite, -1 if -Infinite, 0 otherwise 162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIsInf(double val) { 165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(trio_isinf(val)); 166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* SCHEMAS or XPATH */ 169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPATH_ENABLED 170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathGetSign: 172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: a double value 173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Provides a portable function to detect the sign of a double 175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Modified from trio code 176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://sourceforge.net/projects/ctrio/ 177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the value is Negative, 0 if positive 179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathGetSign(double val) { 182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(trio_signbit(val)); 183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: when compatibility allows remove all "fake node libxslt" strings 188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the test should just be name[0] = ' ' 189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG */ 191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_STEP */ 192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_STEP_NTH */ 193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_EXPR */ 194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_EVAL_COUNTS */ 195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNs xmlXPathXMLNamespaceStruct = { 197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, 198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_NAMESPACE_DECL, 199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_XML_NAMESPACE, 200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "xml", 201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, 202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL 203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNsPtr xmlXPathXMLNamespace = &xmlXPathXMLNamespaceStruct; 205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef LIBXML_THREAD_ENABLED 206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Optimizer is disabled only when threaded apps are detected while 208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the library ain't compiled for thread safety. 209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDisableOptimizer = 0; 211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Error handling routines * 216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XP_ERRORNULL: 221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @X: the error code 222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Macro to raise an XPath error and return NULL. 224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_ERRORNULL(X) \ 226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { xmlXPathErr(ctxt, X); return(NULL); } 227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The array xmlXPathErrorMessages corresponds to the enum xmlXPathError 230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char *xmlXPathErrorMessages[] = { 232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Ok\n", 233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Number encoding\n", 234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unfinished literal\n", 235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Start of literal\n", 236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Expected $ for variable reference\n", 237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Undefined variable\n", 238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Invalid predicate\n", 239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Invalid expression\n", 240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Missing closing curly brace\n", 241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unregistered function\n", 242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Invalid operand\n", 243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Invalid type\n", 244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Invalid number of arguments\n", 245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Invalid context size\n", 246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Invalid context position\n", 247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Memory allocation error\n", 248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Syntax error\n", 249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Resource error\n", 250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Sub resource error\n", 251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Undefined namespace prefix\n", 252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Encoding error\n", 253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Char out of XML range\n", 254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Invalid or incomplete context\n", 255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "?? Unknown error ??\n" /* Must be last in the list! */ 256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAXERRNO ((int)(sizeof(xmlXPathErrorMessages) / \ 258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlXPathErrorMessages[0])) - 1) 259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathErrMemory: 261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath context 262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of attribute error 265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathErrMemory(xmlXPathContextPtr ctxt, const char *extra) 268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (extra) { 271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar buf[200]; 272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStrPrintf(buf, 200, 274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "Memory allocation failed : %s\n", 275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project extra); 276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->lastError.message = (char *) xmlStrdup(buf); 277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->lastError.message = (char *) 279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStrdup(BAD_CAST "Memory allocation failed\n"); 280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->lastError.domain = XML_FROM_XPATH; 282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->lastError.code = XML_ERR_NO_MEMORY; 283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != NULL) 284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error(ctxt->userData, &ctxt->lastError); 285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (extra) 287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, 288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, XML_FROM_XPATH, 289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, 290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project extra, NULL, NULL, 0, 0, 291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Memory allocation failed : %s\n", extra); 292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, 294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, XML_FROM_XPATH, 295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, 296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, NULL, 0, 0, 297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Memory allocation failed\n"); 298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPErrMemory: 303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath parser context 304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of attribute error 307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPErrMemory(xmlXPathParserContextPtr ctxt, const char *extra) 310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, extra); 313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = XPATH_MEMORY_ERROR; 315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(ctxt->context, extra); 316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathErr: 321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a XPath parser context 322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code 323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an XPath error 325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathErr(xmlXPathParserContextPtr ctxt, int error) 328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((error < 0) || (error > MAXERRNO)) 330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project error = MAXERRNO; 331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) { 332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, 333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, XML_FROM_XPATH, 334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project error + XML_XPATH_EXPRESSION_OK - XPATH_EXPRESSION_OK, 335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_ERROR, NULL, 0, 336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, NULL, 0, 0, 337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrorMessages[error]); 338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = error; 341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context == NULL) { 342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, 343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, XML_FROM_XPATH, 344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project error + XML_XPATH_EXPRESSION_OK - XPATH_EXPRESSION_OK, 345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_ERROR, NULL, 0, 346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) ctxt->base, NULL, NULL, 347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->cur - ctxt->base, 0, 348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrorMessages[error]); 349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* cleanup current last error */ 353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlResetError(&ctxt->context->lastError); 354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->lastError.domain = XML_FROM_XPATH; 356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->lastError.code = error + XML_XPATH_EXPRESSION_OK - 357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_EXPRESSION_OK; 358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->lastError.level = XML_ERR_ERROR; 359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->lastError.str1 = (char *) xmlStrdup(ctxt->base); 360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->lastError.int1 = ctxt->cur - ctxt->base; 361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->lastError.node = ctxt->context->debugNode; 362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->error != NULL) { 363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->error(ctxt->context->userData, 364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &ctxt->context->lastError); 365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, 367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, ctxt->context->debugNode, XML_FROM_XPATH, 368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project error + XML_XPATH_EXPRESSION_OK - XPATH_EXPRESSION_OK, 369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_ERROR, NULL, 0, 370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) ctxt->base, NULL, NULL, 371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->cur - ctxt->base, 0, 372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrorMessages[error]); 373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPatherror: 379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @file: the file name 381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @line: the line number 382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @no: the error number 383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Formats an error message. 385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPatherror(xmlXPathParserContextPtr ctxt, const char *file ATTRIBUTE_UNUSED, 388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int line ATTRIBUTE_UNUSED, int no) { 389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErr(ctxt, no); 390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Utilities * 395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xsltPointerList: 400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pointer-list for various purposes. 402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlPointerList xmlPointerList; 404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlPointerList *xmlPointerListPtr; 405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlPointerList { 406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void **items; 407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int number; 408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int size; 409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* TODO: Since such a list-handling is used in xmlschemas.c and libxslt 412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* and here, we should make the functions public. 413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/ 414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPointerListAddSize(xmlPointerListPtr list, 416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *item, 417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int initialSize) 418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list->items == NULL) { 420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (initialSize <= 0) 421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project initialSize = 1; 422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list->items = (void **) xmlMalloc( 423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project initialSize * sizeof(void *)); 424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list->items == NULL) { 425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, 426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlPointerListCreate: allocating item\n"); 427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list->number = 0; 430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list->size = initialSize; 431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (list->size <= list->number) { 432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list->size *= 2; 433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list->items = (void **) xmlRealloc(list->items, 434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list->size * sizeof(void *)); 435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list->items == NULL) { 436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, 437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlPointerListCreate: re-allocating item\n"); 438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list->size = 0; 439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project list->items[list->number++] = item; 443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xsltPointerListCreate: 448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates an xsltPointerList structure. 450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a xsltPointerList structure or NULL in case of an error. 452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlPointerListPtr 454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPointerListCreate(int initialSize) 455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPointerListPtr ret; 457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlMalloc(sizeof(xmlPointerList)); 459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, 461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlPointerListCreate: allocating item\n"); 462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlPointerList)); 465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (initialSize > 0) { 466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPointerListAddSize(ret, NULL, initialSize); 467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->number = 0; 468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xsltPointerListFree: 474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Frees the xsltPointerList structure. This does not free 476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the content of the list. 477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPointerListFree(xmlPointerListPtr list) 480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list == NULL) 482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list->items != NULL) 484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(list->items); 485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(list); 486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parser Types * 491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Types are private: 496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_END=0, 500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_AND, 501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_OR, 502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_EQUAL, 503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_CMP, 504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_PLUS, 505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_MULT, 506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_UNION, 507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_ROOT, 508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_NODE, 509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_RESET, /* 10 */ 510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_COLLECT, 511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_VALUE, /* 12 */ 512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_VARIABLE, 513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_FUNCTION, 514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_ARG, 515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_PREDICATE, 516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_FILTER, /* 17 */ 517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XPATH_OP_SORT /* 18 */ 518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ,XPATH_OP_RANGETO 520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlXPathOp; 522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_ANCESTOR = 1, 525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_ANCESTOR_OR_SELF, 526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_ATTRIBUTE, 527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_CHILD, 528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_DESCENDANT, 529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_DESCENDANT_OR_SELF, 530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_FOLLOWING, 531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_FOLLOWING_SIBLING, 532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_NAMESPACE, 533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_PARENT, 534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_PRECEDING, 535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_PRECEDING_SIBLING, 536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_SELF 537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlXPathAxisVal; 538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TEST_NONE = 0, 541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TEST_TYPE = 1, 542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TEST_PI = 2, 543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TEST_ALL = 3, 544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TEST_NS = 4, 545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TEST_NAME = 5 546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlXPathTestVal; 547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TYPE_NODE = 0, 550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TYPE_COMMENT = XML_COMMENT_NODE, 551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TYPE_TEXT = XML_TEXT_NODE, 552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TYPE_PI = XML_PI_NODE 553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlXPathTypeVal; 554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_REWRITE_DOS_CHILD_ELEM 1 556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlXPathStepOp xmlXPathStepOp; 558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlXPathStepOp *xmlXPathStepOpPtr; 559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlXPathStepOp { 560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathOp op; /* The identifier of the operation */ 561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ch1; /* First child */ 562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ch2; /* Second child */ 563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int value; 564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int value2; 565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int value3; 566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *value4; 567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *value5; 568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *cache; 569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *cacheURI; 570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int rewriteType; 571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlXPathCompExpr { 574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbStep; /* Number of steps in this expression */ 575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxStep; /* Maximum number of steps allocated */ 576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOp *steps; /* ops for computation of this expression */ 577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int last; /* index of last step in expression */ 578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *expr; /* the expression being computed */ 579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictPtr dict; /* the dictionnary to use if any */ 580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EVAL_COUNTS 581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nb; 582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *string; 583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING 585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPatternPtr stream; 586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Forward declarations * 592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeValueTree(xmlNodeSetPtr obj); 596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathReleaseObject(xmlXPathContextPtr ctxt, xmlXPathObjectPtr obj); 598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalFirst(xmlXPathParserContextPtr ctxt, 600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr op, xmlNodePtr *first); 601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalToBoolean(xmlXPathParserContextPtr ctxt, 603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr op, 604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int isPredicate); 605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parser Type functions * 609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewCompExpr: 614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new Xpath component 616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated xmlXPathCompExprPtr or NULL in case of error 618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathCompExprPtr 620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewCompExpr(void) { 621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprPtr cur; 622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = (xmlXPathCompExprPtr) xmlMalloc(sizeof(xmlXPathCompExpr)); 624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "allocating component\n"); 626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur, 0, sizeof(xmlXPathCompExpr)); 629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->maxStep = 10; 630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nbStep = 0; 631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->steps = (xmlXPathStepOp *) xmlMalloc(cur->maxStep * 632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlXPathStepOp)); 633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->steps == NULL) { 634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "allocating steps\n"); 635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(cur); 636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur->steps, 0, cur->maxStep * sizeof(xmlXPathStepOp)); 639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->last = -1; 640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EVAL_COUNTS 641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nb = 0; 642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeCompExpr: 648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: an XPATH comp 649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up the memory allocated by @comp 651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeCompExpr(xmlXPathCompExprPtr comp) 654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr op; 656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp == NULL) 659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->dict == NULL) { 661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < comp->nbStep; i++) { 662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op = &comp->steps[i]; 663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value4 != NULL) { 664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->op == XPATH_OP_VALUE) 665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(op->value4); 666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(op->value4); 668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value5 != NULL) 670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(op->value5); 671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < comp->nbStep; i++) { 674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op = &comp->steps[i]; 675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value4 != NULL) { 676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->op == XPATH_OP_VALUE) 677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(op->value4); 678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictFree(comp->dict); 681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->steps != NULL) { 683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(comp->steps); 684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EVAL_COUNTS 686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->string != NULL) { 687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(comp->string); 688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING 691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->stream != NULL) { 692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreePatternList(comp->stream); 693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->expr != NULL) { 696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(comp->expr); 697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(comp); 700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompExprAdd: 704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the compiled expression 705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ch1: first child index 706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ch2: second child index 707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @op: an op 708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the first int value 709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value2: the second int value 710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value3: the third int value 711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value4: the first string value 712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value5: the second string value 713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add a step to an XPath Compiled Expression 715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of failure, the index otherwise 717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompExprAdd(xmlXPathCompExprPtr comp, int ch1, int ch2, 720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathOp op, int value, 721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int value2, int value3, void *value4, void *value5) { 722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->nbStep >= comp->maxStep) { 723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOp *real; 724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->maxStep *= 2; 726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project real = (xmlXPathStepOp *) xmlRealloc(comp->steps, 727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->maxStep * sizeof(xmlXPathStepOp)); 728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (real == NULL) { 729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->maxStep /= 2; 730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "adding step\n"); 731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps = real; 734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->last = comp->nbStep; 736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].rewriteType = 0; 737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].ch1 = ch1; 738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].ch2 = ch2; 739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].op = op; 740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].value = value; 741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].value2 = value2; 742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].value3 = value3; 743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((comp->dict != NULL) && 744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((op == XPATH_OP_FUNCTION) || (op == XPATH_OP_VARIABLE) || 745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (op == XPATH_OP_COLLECT))) { 746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value4 != NULL) { 747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].value4 = (xmlChar *) 748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *)xmlDictLookup(comp->dict, value4, -1); 749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(value4); 750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].value4 = NULL; 752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value5 != NULL) { 753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].value5 = (xmlChar *) 754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *)xmlDictLookup(comp->dict, value5, -1); 755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(value5); 756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].value5 = NULL; 758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].value4 = value4; 760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].value5 = value5; 761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].cache = NULL; 763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(comp->nbStep++); 764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompSwap: 768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the compiled expression 769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @op: operation index 770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Swaps 2 operations in the compiled expression 772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompSwap(xmlXPathStepOpPtr op) { 775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int tmp; 776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef LIBXML_THREAD_ENABLED 778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Since this manipulates possibly shared variables, this is 780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * disabled if one detects that the library is used in a multithreaded 781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * application 782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathDisableOptimizer) 784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = op->ch1; 788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op->ch1 = op->ch2; 789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op->ch2 = tmp; 790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PUSH_FULL_EXPR(op, op1, op2, val, val2, val3, val4, val5) \ 793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprAdd(ctxt->comp, (op1), (op2), \ 794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (op), (val), (val2), (val3), (val4), (val5)) 795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PUSH_LONG_EXPR(op, val, val2, val3, val4, val5) \ 796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprAdd(ctxt->comp, ctxt->comp->last, -1, \ 797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (op), (val), (val2), (val3), (val4), (val5)) 798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PUSH_LEAVE_EXPR(op, val, val2) \ 800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompExprAdd(ctxt->comp, -1, -1, (op), (val), (val2), 0 ,NULL ,NULL) 801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PUSH_UNARY_EXPR(op, ch, val, val2) \ 803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompExprAdd(ctxt->comp, (ch), -1, (op), (val), (val2), 0 ,NULL ,NULL) 804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PUSH_BINARY_EXPR(op, ch1, ch2, val, val2) \ 806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompExprAdd(ctxt->comp, (ch1), (ch2), (op), \ 807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (val), (val2), 0 ,NULL ,NULL) 808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XPath object cache structures * 812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define XP_DEFAULT_CACHE_ON */ 816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_HAS_CACHE(c) ((c != NULL) && ((c)->cache != NULL)) 818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlXPathContextCache xmlXPathContextCache; 820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlXPathContextCache *xmlXPathContextCachePtr; 821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlXPathContextCache { 822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPointerListPtr nodesetObjs; /* contains xmlXPathObjectPtr */ 823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPointerListPtr stringObjs; /* contains xmlXPathObjectPtr */ 824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPointerListPtr booleanObjs; /* contains xmlXPathObjectPtr */ 825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPointerListPtr numberObjs; /* contains xmlXPathObjectPtr */ 826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPointerListPtr miscObjs; /* contains xmlXPathObjectPtr */ 827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxNodeset; 828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxString; 829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxBoolean; 830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxNumber; 831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxMisc; 832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgCachedAll; 834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgCachedNodeset; 835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgCachedString; 836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgCachedBool; 837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgCachedNumber; 838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgCachedPoint; 839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgCachedRange; 840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgCachedLocset; 841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgCachedUsers; 842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgCachedXSLTTree; 843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgCachedUndefined; 844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgReusedAll; 847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgReusedNodeset; 848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgReusedString; 849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgReusedBool; 850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgReusedNumber; 851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgReusedPoint; 852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgReusedRange; 853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgReusedLocset; 854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgReusedUsers; 855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgReusedXSLTTree; 856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int dbgReusedUndefined; 857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Debugging related functions * 864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define STRANGE \ 868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, \ 869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Internal error at %s:%d\n", \ 870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __FILE__, __LINE__); 871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DEBUG_ENABLED 873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpNode(FILE *output, xmlNodePtr cur, int depth) { 875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char shift[100]; 877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;((i < depth) && (i < 25));i++) 879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = ' '; 880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = 0; 881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, shift); 883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Node is NULL !\n"); 884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_DOCUMENT_NODE) || 889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_HTML_DOCUMENT_NODE)) { 890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, shift); 891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " /\n"); 892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == XML_ATTRIBUTE_NODE) 893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDebugDumpAttr(output, (xmlAttrPtr)cur, depth); 894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDebugDumpOneNode(output, cur, depth); 896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpNodeList(FILE *output, xmlNodePtr cur, int depth) { 899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr tmp; 900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char shift[100]; 902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;((i < depth) && (i < 25));i++) 904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = ' '; 905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = 0; 906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, shift); 908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Node is NULL !\n"); 909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = cur; 915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDebugDumpOneNode(output, tmp, depth); 917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpNodeSet(FILE *output, xmlNodeSetPtr cur, int depth) { 922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char shift[100]; 924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;((i < depth) && (i < 25));i++) 926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = ' '; 927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = 0; 928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, shift); 931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NodeSet is NULL !\n"); 932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != NULL) { 937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Set contains %d nodes:\n", cur->nodeNr); 938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < cur->nodeNr;i++) { 939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, shift); 940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%d", i + 1); 941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpNode(output, cur->nodeTab[i], depth + 1); 942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpValueTree(FILE *output, xmlNodeSetPtr cur, int depth) { 948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char shift[100]; 950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;((i < depth) && (i < 25));i++) 952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = ' '; 953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = 0; 954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == NULL) || (cur->nodeNr == 0) || (cur->nodeTab[0] == NULL)) { 956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, shift); 957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Value Tree is NULL !\n"); 958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, shift); 963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%d", i + 1); 964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpNodeList(output, cur->nodeTab[0]->children, depth + 1); 965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(LIBXML_XPTR_ENABLED) 967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpLocationSet(FILE *output, xmlLocationSetPtr cur, int depth) { 969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char shift[100]; 971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;((i < depth) && (i < 25));i++) 973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = ' '; 974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = 0; 975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, shift); 978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "LocationSet is NULL !\n"); 979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < cur->locNr;i++) { 984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, shift); 985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%d : ", i + 1); 986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpObject(output, cur->locTab[i], depth + 1); 987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_XPTR_ENABLED */ 990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathDebugDumpObject: 993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output: the FILE * to dump the output 994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the object to inspect 995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @depth: indentation level 996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump the content of the object for debugging purposes 998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 1000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpObject(FILE *output, xmlXPathObjectPtr cur, int depth) { 1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char shift[100]; 1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (output == NULL) return; 1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;((i < depth) && (i < 25));i++) 1007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = ' '; 1008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = 0; 1009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, shift); 1012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 1014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is empty (NULL)\n"); 1015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch(cur->type) { 1018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 1019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is uninitialized\n"); 1020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 1022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is a Node Set :\n"); 1023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpNodeSet(output, cur->nodesetval, depth); 1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 1026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is an XSLT value tree :\n"); 1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpValueTree(output, cur->nodesetval, depth); 1028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is a Boolean : "); 1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->boolval) fprintf(output, "true\n"); 1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else fprintf(output, "false\n"); 1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 1035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (xmlXPathIsInf(cur->floatval)) { 1036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 1: 1037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is a number : Infinity\n"); 1038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case -1: 1040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is a number : -Infinity\n"); 1041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 1043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsNaN(cur->floatval)) { 1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is a number : NaN\n"); 1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->floatval == 0 && xmlXPathGetSign(cur->floatval) != 0) { 1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is a number : 0\n"); 1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is a number : %0g\n", cur->floatval); 1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 1053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is a string : "); 1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDebugDumpString(output, cur->stringval); 1055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "\n"); 1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is a point : index %d in node", cur->index); 1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user, depth + 1); 1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "\n"); 1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->user2 == NULL) || 1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((cur->user2 == cur->user) && (cur->index == cur->index2))) { 1065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is a collapsed range :\n"); 1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, shift); 1067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->index >= 0) 1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "index %d in ", cur->index); 1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "node\n"); 1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user, 1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth + 1); 1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is a range :\n"); 1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, shift); 1075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "From "); 1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->index >= 0) 1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "index %d in ", cur->index); 1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "node\n"); 1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user, 1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth + 1); 1081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, shift); 1082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "To "); 1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->index2 >= 0) 1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "index %d in ", cur->index2); 1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "node\n"); 1086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user2, 1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth + 1); 1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "\n"); 1089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(LIBXML_XPTR_ENABLED) 1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is a Location Set:\n"); 1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpLocationSet(output, 1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlLocationSetPtr) cur->user, depth); 1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Object is user defined\n"); 1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpStepOp(FILE *output, xmlXPathCompExprPtr comp, 1106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr op, int depth) { 1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char shift[100]; 1109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;((i < depth) && (i < 25));i++) 1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = ' '; 1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = 0; 1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, shift); 1115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op == NULL) { 1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Step is NULL\n"); 1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (op->op) { 1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_END: 1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "END"); break; 1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_AND: 1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "AND"); break; 1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_OR: 1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "OR"); break; 1126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_EQUAL: 1127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value) 1128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "EQUAL ="); 1129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "EQUAL !="); 1131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_CMP: 1133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value) 1134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "CMP <"); 1135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "CMP >"); 1137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!op->value2) 1138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "="); 1139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_PLUS: 1141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value == 0) 1142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "PLUS -"); 1143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (op->value == 1) 1144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "PLUS +"); 1145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (op->value == 2) 1146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "PLUS unary -"); 1147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (op->value == 3) 1148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "PLUS unary - -"); 1149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_MULT: 1151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value == 0) 1152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "MULT *"); 1153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (op->value == 1) 1154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "MULT div"); 1155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "MULT mod"); 1157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_UNION: 1159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "UNION"); break; 1160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_ROOT: 1161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "ROOT"); break; 1162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_NODE: 1163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NODE"); break; 1164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_RESET: 1165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "RESET"); break; 1166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_SORT: 1167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "SORT"); break; 1168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_COLLECT: { 1169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathAxisVal axis = (xmlXPathAxisVal)op->value; 1170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathTestVal test = (xmlXPathTestVal)op->value2; 1171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathTypeVal type = (xmlXPathTypeVal)op->value3; 1172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *prefix = op->value4; 1173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name = op->value5; 1174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "COLLECT "); 1176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (axis) { 1177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_ANCESTOR: 1178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'ancestors' "); break; 1179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_ANCESTOR_OR_SELF: 1180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'ancestors-or-self' "); break; 1181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_ATTRIBUTE: 1182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'attributes' "); break; 1183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_CHILD: 1184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'child' "); break; 1185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_DESCENDANT: 1186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'descendant' "); break; 1187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_DESCENDANT_OR_SELF: 1188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'descendant-or-self' "); break; 1189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_FOLLOWING: 1190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'following' "); break; 1191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_FOLLOWING_SIBLING: 1192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'following-siblings' "); break; 1193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_NAMESPACE: 1194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'namespace' "); break; 1195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_PARENT: 1196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'parent' "); break; 1197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_PRECEDING: 1198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'preceding' "); break; 1199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_PRECEDING_SIBLING: 1200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'preceding-sibling' "); break; 1201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_SELF: 1202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " 'self' "); break; 1203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (test) { 1205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_NONE: 1206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'none' "); break; 1207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_TYPE: 1208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'type' "); break; 1209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_PI: 1210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'PI' "); break; 1211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_ALL: 1212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'all' "); break; 1213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_NS: 1214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'namespace' "); break; 1215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_NAME: 1216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'name' "); break; 1217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (type) { 1219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TYPE_NODE: 1220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'node' "); break; 1221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TYPE_COMMENT: 1222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'comment' "); break; 1223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TYPE_TEXT: 1224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'text' "); break; 1225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TYPE_PI: 1226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "'PI' "); break; 1227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix != NULL) 1229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%s:", prefix); 1230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) 1231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "%s", (const char *) name); 1232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_VALUE: { 1236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr object = (xmlXPathObjectPtr) op->value4; 1237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "ELEM "); 1239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpObject(output, object, 0); 1240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto finish; 1241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_VARIABLE: { 1243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *prefix = op->value5; 1244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name = op->value4; 1245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix != NULL) 1247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "VARIABLE %s:%s", prefix, name); 1248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "VARIABLE %s", name); 1250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_FUNCTION: { 1253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbargs = op->value; 1254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *prefix = op->value5; 1255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name = op->value4; 1256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix != NULL) 1258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "FUNCTION %s:%s(%d args)", 1259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prefix, name, nbargs); 1260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "FUNCTION %s(%d args)", name, nbargs); 1262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_ARG: fprintf(output, "ARG"); break; 1265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_PREDICATE: fprintf(output, "PREDICATE"); break; 1266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_FILTER: fprintf(output, "FILTER"); break; 1267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 1268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_RANGETO: fprintf(output, "RANGETO"); break; 1269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 1271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "UNKNOWN %d\n", op->op); return; 1272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "\n"); 1274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfinish: 1275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 >= 0) 1276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpStepOp(output, comp, &comp->steps[op->ch1], depth + 1); 1277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 >= 0) 1278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpStepOp(output, comp, &comp->steps[op->ch2], depth + 1); 1279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathDebugDumpCompExpr: 1283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output: the FILE * for the output 1284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the precompiled XPath expression 1285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @depth: the indentation level. 1286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dumps the tree of the compiled XPath expression. 1288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 1290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpCompExpr(FILE *output, xmlXPathCompExprPtr comp, 1291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int depth) { 1292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char shift[100]; 1294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((output == NULL) || (comp == NULL)) return; 1296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;((i < depth) && (i < 25));i++) 1298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = ' '; 1299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project shift[2 * i] = shift[2 * i + 1] = 0; 1300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, shift); 1302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "Compiled Expression : %d elements\n", 1304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->nbStep); 1305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = comp->last; 1306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpStepOp(output, comp, &comp->steps[i], depth + 1); 1307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 1310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 1312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* XPath object usage related debugging variables. 1313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/ 1314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterUndefined = 0; 1315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterNodeset = 0; 1316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterBool = 0; 1317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterNumber = 0; 1318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterString = 0; 1319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterPoint = 0; 1320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterRange = 0; 1321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterLocset = 0; 1322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterUsers = 0; 1323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterXSLTTree = 0; 1324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjCounterAll = 0; 1325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalUndefined = 0; 1327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalNodeset = 0; 1328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalBool = 0; 1329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalNumber = 0; 1330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalString = 0; 1331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalPoint = 0; 1332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalRange = 0; 1333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalLocset = 0; 1334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalUsers = 0; 1335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalXSLTTree = 0; 1336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjTotalAll = 0; 1337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxUndefined = 0; 1339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxNodeset = 0; 1340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxBool = 0; 1341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxNumber = 0; 1342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxString = 0; 1343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxPoint = 0; 1344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxRange = 0; 1345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxLocset = 0; 1346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxUsers = 0; 1347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxXSLTTree = 0; 1348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlXPathDebugObjMaxAll = 0; 1349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* REVISIT TODO: Make this static when committing */ 1351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugObjUsageReset(xmlXPathContextPtr ctxt) 1353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 1355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->cache != NULL) { 1356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache = 1357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathContextCachePtr) ctxt->cache; 1358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedAll = 0; 1360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedNodeset = 0; 1361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedString = 0; 1362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedBool = 0; 1363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedNumber = 0; 1364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedPoint = 0; 1365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedRange = 0; 1366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedLocset = 0; 1367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedUsers = 0; 1368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedXSLTTree = 0; 1369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedUndefined = 0; 1370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedAll = 0; 1372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedNodeset = 0; 1373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedString = 0; 1374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedBool = 0; 1375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedNumber = 0; 1376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedPoint = 0; 1377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedRange = 0; 1378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedLocset = 0; 1379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedUsers = 0; 1380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedXSLTTree = 0; 1381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedUndefined = 0; 1382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterUndefined = 0; 1386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterNodeset = 0; 1387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterBool = 0; 1388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterNumber = 0; 1389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterString = 0; 1390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterPoint = 0; 1391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterRange = 0; 1392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterLocset = 0; 1393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterUsers = 0; 1394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterXSLTTree = 0; 1395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterAll = 0; 1396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalUndefined = 0; 1398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalNodeset = 0; 1399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalBool = 0; 1400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalNumber = 0; 1401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalString = 0; 1402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalPoint = 0; 1403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalRange = 0; 1404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalLocset = 0; 1405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalUsers = 0; 1406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalXSLTTree = 0; 1407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalAll = 0; 1408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxUndefined = 0; 1410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxNodeset = 0; 1411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxBool = 0; 1412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxNumber = 0; 1413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxString = 0; 1414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxPoint = 0; 1415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxRange = 0; 1416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxLocset = 0; 1417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxUsers = 0; 1418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxXSLTTree = 0; 1419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxAll = 0; 1420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugObjUsageRequested(xmlXPathContextPtr ctxt, 1425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectType objType) 1426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int isCached = 0; 1428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 1430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->cache != NULL) { 1431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache = 1432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathContextCachePtr) ctxt->cache; 1433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project isCached = 1; 1435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedAll++; 1437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (objType) { 1438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 1439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedUndefined++; 1440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 1442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedNodeset++; 1443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 1445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedBool++; 1446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 1448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedNumber++; 1449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 1451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedString++; 1452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 1454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedPoint++; 1455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 1457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedRange++; 1458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 1460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedLocset++; 1461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 1463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedUsers++; 1464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 1466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgReusedXSLTTree++; 1467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 1469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (objType) { 1475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 1476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! isCached) 1477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalUndefined++; 1478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterUndefined++; 1479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathDebugObjCounterUndefined > 1480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxUndefined) 1481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxUndefined = 1482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterUndefined; 1483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 1485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! isCached) 1486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalNodeset++; 1487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterNodeset++; 1488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathDebugObjCounterNodeset > 1489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxNodeset) 1490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxNodeset = 1491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterNodeset; 1492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 1494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! isCached) 1495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalBool++; 1496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterBool++; 1497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathDebugObjCounterBool > 1498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxBool) 1499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxBool = 1500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterBool; 1501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 1503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! isCached) 1504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalNumber++; 1505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterNumber++; 1506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathDebugObjCounterNumber > 1507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxNumber) 1508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxNumber = 1509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterNumber; 1510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 1512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! isCached) 1513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalString++; 1514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterString++; 1515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathDebugObjCounterString > 1516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxString) 1517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxString = 1518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterString; 1519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 1521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! isCached) 1522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalPoint++; 1523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterPoint++; 1524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathDebugObjCounterPoint > 1525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxPoint) 1526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxPoint = 1527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterPoint; 1528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 1530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! isCached) 1531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalRange++; 1532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterRange++; 1533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathDebugObjCounterRange > 1534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxRange) 1535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxRange = 1536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterRange; 1537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 1539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! isCached) 1540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalLocset++; 1541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterLocset++; 1542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathDebugObjCounterLocset > 1543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxLocset) 1544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxLocset = 1545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterLocset; 1546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 1548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! isCached) 1549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalUsers++; 1550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterUsers++; 1551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathDebugObjCounterUsers > 1552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxUsers) 1553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxUsers = 1554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterUsers; 1555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 1557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! isCached) 1558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalXSLTTree++; 1559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterXSLTTree++; 1560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathDebugObjCounterXSLTTree > 1561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxXSLTTree) 1562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxXSLTTree = 1563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterXSLTTree; 1564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 1566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! isCached) 1569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjTotalAll++; 1570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterAll++; 1571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathDebugObjCounterAll > 1572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxAll) 1573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjMaxAll = 1574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterAll; 1575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugObjUsageReleased(xmlXPathContextPtr ctxt, 1579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectType objType) 1580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int isCached = 0; 1582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 1584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->cache != NULL) { 1585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache = 1586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathContextCachePtr) ctxt->cache; 1587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project isCached = 1; 1589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedAll++; 1591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (objType) { 1592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 1593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedUndefined++; 1594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 1596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedNodeset++; 1597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 1599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedBool++; 1600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 1602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedNumber++; 1603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 1605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedString++; 1606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 1608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedPoint++; 1609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 1611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedRange++; 1612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 1614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedLocset++; 1615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 1617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedUsers++; 1618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 1620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->dbgCachedXSLTTree++; 1621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 1623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (objType) { 1629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 1630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterUndefined--; 1631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 1633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterNodeset--; 1634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 1636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterBool--; 1637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 1639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterNumber--; 1640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 1642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterString--; 1643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 1645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterPoint--; 1646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 1648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterRange--; 1649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 1651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterLocset--; 1652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 1654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterUsers--; 1655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 1657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterXSLTTree--; 1658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 1660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterAll--; 1663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* REVISIT TODO: Make this static when committing */ 1666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugObjUsageDisplay(xmlXPathContextPtr ctxt) 1668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int reqAll, reqNodeset, reqString, reqBool, reqNumber, 1670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqXSLTTree, reqUndefined; 1671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int caAll = 0, caNodeset = 0, caString = 0, caBool = 0, 1672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project caNumber = 0, caXSLTTree = 0, caUndefined = 0; 1673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int reAll = 0, reNodeset = 0, reString = 0, reBool = 0, 1674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reNumber = 0, reXSLTTree = 0, reUndefined = 0; 1675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int leftObjs = xmlXPathDebugObjCounterAll; 1676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqAll = xmlXPathDebugObjTotalAll; 1678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqNodeset = xmlXPathDebugObjTotalNodeset; 1679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqString = xmlXPathDebugObjTotalString; 1680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqBool = xmlXPathDebugObjTotalBool; 1681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqNumber = xmlXPathDebugObjTotalNumber; 1682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqXSLTTree = xmlXPathDebugObjTotalXSLTTree; 1683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqUndefined = xmlXPathDebugObjTotalUndefined; 1684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# XPath object usage:\n"); 1686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 1688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->cache != NULL) { 1689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache = 1690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathContextCachePtr) ctxt->cache; 1691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reAll = cache->dbgReusedAll; 1693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqAll += reAll; 1694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reNodeset = cache->dbgReusedNodeset; 1695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqNodeset += reNodeset; 1696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reString = cache->dbgReusedString; 1697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqString += reString; 1698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reBool = cache->dbgReusedBool; 1699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqBool += reBool; 1700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reNumber = cache->dbgReusedNumber; 1701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqNumber += reNumber; 1702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reXSLTTree = cache->dbgReusedXSLTTree; 1703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqXSLTTree += reXSLTTree; 1704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reUndefined = cache->dbgReusedUndefined; 1705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reqUndefined += reUndefined; 1706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project caAll = cache->dbgCachedAll; 1708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project caBool = cache->dbgCachedBool; 1709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project caNodeset = cache->dbgCachedNodeset; 1710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project caString = cache->dbgCachedString; 1711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project caNumber = cache->dbgCachedNumber; 1712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project caXSLTTree = cache->dbgCachedXSLTTree; 1713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project caUndefined = cache->dbgCachedUndefined; 1714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cache->nodesetObjs) 1716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project leftObjs -= cache->nodesetObjs->number; 1717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cache->stringObjs) 1718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project leftObjs -= cache->stringObjs->number; 1719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cache->booleanObjs) 1720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project leftObjs -= cache->booleanObjs->number; 1721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cache->numberObjs) 1722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project leftObjs -= cache->numberObjs->number; 1723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cache->miscObjs) 1724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project leftObjs -= cache->miscObjs->number; 1725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# all\n"); 1729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# total : %d\n", reqAll); 1730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# left : %d\n", leftObjs); 1731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# created: %d\n", xmlXPathDebugObjTotalAll); 1732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# reused : %d\n", reAll); 1733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# max : %d\n", xmlXPathDebugObjMaxAll); 1734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# node-sets\n"); 1736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# total : %d\n", reqNodeset); 1737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# created: %d\n", xmlXPathDebugObjTotalNodeset); 1738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# reused : %d\n", reNodeset); 1739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# max : %d\n", xmlXPathDebugObjMaxNodeset); 1740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# strings\n"); 1742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# total : %d\n", reqString); 1743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# created: %d\n", xmlXPathDebugObjTotalString); 1744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# reused : %d\n", reString); 1745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# max : %d\n", xmlXPathDebugObjMaxString); 1746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# booleans\n"); 1748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# total : %d\n", reqBool); 1749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# created: %d\n", xmlXPathDebugObjTotalBool); 1750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# reused : %d\n", reBool); 1751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# max : %d\n", xmlXPathDebugObjMaxBool); 1752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# numbers\n"); 1754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# total : %d\n", reqNumber); 1755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# created: %d\n", xmlXPathDebugObjTotalNumber); 1756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# reused : %d\n", reNumber); 1757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# max : %d\n", xmlXPathDebugObjMaxNumber); 1758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# XSLT result tree fragments\n"); 1760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# total : %d\n", reqXSLTTree); 1761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# created: %d\n", xmlXPathDebugObjTotalXSLTTree); 1762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# reused : %d\n", reXSLTTree); 1763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# max : %d\n", xmlXPathDebugObjMaxXSLTTree); 1764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# undefined\n"); 1766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# total : %d\n", reqUndefined); 1767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# created: %d\n", xmlXPathDebugObjTotalUndefined); 1768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# reused : %d\n", reUndefined); 1769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("# max : %d\n", xmlXPathDebugObjMaxUndefined); 1770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* XP_DEBUG_OBJ_USAGE */ 1774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_DEBUG_ENABLED */ 1776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 1778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XPath object caching * 1780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 1782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewCache: 1785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new object cache 1787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathCache just allocated. 1789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathContextCachePtr 1791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewCache(void) 1792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr ret; 1794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathContextCachePtr) xmlMalloc(sizeof(xmlXPathContextCache)); 1796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 1797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating object cache\n"); 1798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathContextCache)); 1801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->maxNodeset = 100; 1802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->maxString = 100; 1803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->maxBoolean = 100; 1804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->maxNumber = 100; 1805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->maxMisc = 100; 1806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 1807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheFreeObjectList(xmlPointerListPtr list) 1811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr obj; 1814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (list == NULL) 1816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < list->number; i++) { 1819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = list->items[i]; 1820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that it is already assured that we don't need to 1822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * look out for namespace nodes in the node-set. 1823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodesetval != NULL) { 1825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodesetval->nodeTab != NULL) 1826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(obj->nodesetval->nodeTab); 1827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(obj->nodesetval); 1828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(obj); 1830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 1831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjCounterAll--; 1832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPointerListFree(list); 1835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeCache(xmlXPathContextCachePtr cache) 1839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cache == NULL) 1841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cache->nodesetObjs) 1843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheFreeObjectList(cache->nodesetObjs); 1844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cache->stringObjs) 1845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheFreeObjectList(cache->stringObjs); 1846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cache->booleanObjs) 1847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheFreeObjectList(cache->booleanObjs); 1848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cache->numberObjs) 1849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheFreeObjectList(cache->numberObjs); 1850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cache->miscObjs) 1851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheFreeObjectList(cache->miscObjs); 1852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(cache); 1853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathContextSetCache: 1857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 1859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @active: enables/disables (creates/frees) the cache 1860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: a value with semantics dependant on @options 1861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options: options (currently only the value 0 is used) 1862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates/frees an object cache on the XPath context. 1864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If activates XPath objects (xmlXPathObject) will be cached internally 1865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to be reused. 1866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options: 1867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0: This will set the XPath object caching: 1868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: 1869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This will set the maximum number of XPath objects 1870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to be cached per slot 1871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * There are 5 slots for: node-set, string, number, boolean, and 1872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * misc objects. Use <0 for the default number (100). 1873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Other values for @options have currently no effect. 1874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the setting succeeded, and -1 on API or internal errors. 1876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathContextSetCache(xmlXPathContextPtr ctxt, 1879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int active, 1880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int value, 1881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int options) 1882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 1884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (active) { 1886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache; 1887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->cache == NULL) { 1889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->cache = xmlXPathNewCache(); 1890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->cache == NULL) 1891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache = (xmlXPathContextCachePtr) ctxt->cache; 1894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (options == 0) { 1895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value < 0) 1896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = 100; 1897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->maxNodeset = value; 1898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->maxString = value; 1899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->maxNumber = value; 1900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->maxBoolean = value; 1901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->maxMisc = value; 1902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->cache != NULL) { 1904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeCache((xmlXPathContextCachePtr) ctxt->cache); 1905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->cache = NULL; 1906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheWrapNodeSet: 1912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 1913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the NodePtr value 1914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathWrapNodeSet(). 1916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wrap the Nodeset @val in a new xmlXPathObjectPtr 1917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object. 1919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr 1921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheWrapNodeSet(xmlXPathContextPtr ctxt, xmlNodeSetPtr val) 1922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->cache != NULL)) { 1924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache = 1925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathContextCachePtr) ctxt->cache; 1926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cache->miscObjs != NULL) && 1928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->miscObjs->number != 0)) 1929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 1930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 1931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 1933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->miscObjs->items[--cache->miscObjs->number]; 1934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_NODESET; 1935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodesetval = val; 1936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 1937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET); 1938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 1940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathWrapNodeSet(val)); 1944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheWrapString: 1949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 1950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the xmlChar * value 1951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathWrapString(). 1953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wraps the @val string into an XPath object. 1954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object. 1956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr 1958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheWrapString(xmlXPathContextPtr ctxt, xmlChar *val) 1959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->cache != NULL)) { 1961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; 1962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cache->stringObjs != NULL) && 1964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->stringObjs->number != 0)) 1965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 1966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 1968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 1970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->stringObjs->items[--cache->stringObjs->number]; 1971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_STRING; 1972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = val; 1973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 1974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); 1975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 1977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cache->miscObjs != NULL) && 1978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->miscObjs->number != 0)) 1979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 1980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 1981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Fallback to misc-cache. 1983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 1985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->miscObjs->items[--cache->miscObjs->number]; 1986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_STRING; 1988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = val; 1989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 1990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); 1991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 1993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathWrapString(val)); 1996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheNewNodeSet: 2000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 2001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the NodePtr value 2002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathNewNodeSet(). 2004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Acquire an xmlXPathObjectPtr of type NodeSet and initialize 2005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it with the single Node @val 2006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object. 2008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr 2010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheNewNodeSet(xmlXPathContextPtr ctxt, xmlNodePtr val) 2011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->cache)) { 2013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; 2014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cache->nodesetObjs != NULL) && 2016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->nodesetObjs->number != 0)) 2017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 2018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 2019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Use the nodset-cache. 2021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 2023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->nodesetObjs->items[--cache->nodesetObjs->number]; 2024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_NODESET; 2025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->boolval = 0; 2026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val) { 2027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret->nodesetval->nodeMax == 0) || 2028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (val->type == XML_NAMESPACE_DECL)) 2029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 2030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique(ret->nodesetval, val); 2031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodesetval->nodeTab[0] = val; 2033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodesetval->nodeNr = 1; 2034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 2037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET); 2038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cache->miscObjs != NULL) && 2041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->miscObjs->number != 0)) 2042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 2043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 2044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Fallback to misc-cache. 2046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 2049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->miscObjs->items[--cache->miscObjs->number]; 2050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_NODESET; 2052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->boolval = 0; 2053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodesetval = xmlXPathNodeSetCreate(val); 2054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 2055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET); 2056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNewNodeSet(val)); 2061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheNewCString: 2065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 2066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the char * value 2067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathNewCString(). 2069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Acquire an xmlXPathObjectPtr of type string and of value @val 2070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object. 2072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr 2074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheNewCString(xmlXPathContextPtr ctxt, const char *val) 2075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->cache)) { 2077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; 2078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cache->stringObjs != NULL) && 2080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->stringObjs->number != 0)) 2081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 2082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 2083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 2085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->stringObjs->items[--cache->stringObjs->number]; 2086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_STRING; 2088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = xmlStrdup(BAD_CAST val); 2089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 2090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); 2091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cache->miscObjs != NULL) && 2094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->miscObjs->number != 0)) 2095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 2096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 2097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 2099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->miscObjs->items[--cache->miscObjs->number]; 2100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_STRING; 2102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = xmlStrdup(BAD_CAST val); 2103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 2104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); 2105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNewCString(val)); 2110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheNewString: 2114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 2115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the xmlChar * value 2116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathNewString(). 2118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Acquire an xmlXPathObjectPtr of type string and of value @val 2119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object. 2121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr 2123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheNewString(xmlXPathContextPtr ctxt, const xmlChar *val) 2124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->cache)) { 2126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; 2127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cache->stringObjs != NULL) && 2129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->stringObjs->number != 0)) 2130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 2131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 2132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 2134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->stringObjs->items[--cache->stringObjs->number]; 2135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_STRING; 2136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val != NULL) 2137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = xmlStrdup(val); 2138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = xmlStrdup((const xmlChar *)""); 2140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 2141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); 2142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cache->miscObjs != NULL) && 2145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->miscObjs->number != 0)) 2146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 2147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 2148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 2150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->miscObjs->items[--cache->miscObjs->number]; 2151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_STRING; 2153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val != NULL) 2154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = xmlStrdup(val); 2155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = xmlStrdup((const xmlChar *)""); 2157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 2158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); 2159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNewString(val)); 2164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheNewBoolean: 2168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 2169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the boolean value 2170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathNewBoolean(). 2172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Acquires an xmlXPathObjectPtr of type boolean and of value @val 2173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object. 2175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr 2177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheNewBoolean(xmlXPathContextPtr ctxt, int val) 2178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->cache)) { 2180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; 2181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cache->booleanObjs != NULL) && 2183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->booleanObjs->number != 0)) 2184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 2185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 2186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 2188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->booleanObjs->items[--cache->booleanObjs->number]; 2189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_BOOLEAN; 2190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->boolval = (val != 0); 2191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 2192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_BOOLEAN); 2193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cache->miscObjs != NULL) && 2196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->miscObjs->number != 0)) 2197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 2198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 2199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 2201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->miscObjs->items[--cache->miscObjs->number]; 2202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_BOOLEAN; 2204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->boolval = (val != 0); 2205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 2206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_BOOLEAN); 2207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNewBoolean(val)); 2212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheNewFloat: 2216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 2217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the double value 2218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathNewFloat(). 2220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Acquires an xmlXPathObjectPtr of type double and of value @val 2221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the created or reused object. 2223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr 2225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheNewFloat(xmlXPathContextPtr ctxt, double val) 2226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->cache)) { 2228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; 2229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cache->numberObjs != NULL) && 2231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->numberObjs->number != 0)) 2232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 2233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 2234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 2236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->numberObjs->items[--cache->numberObjs->number]; 2237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_NUMBER; 2238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->floatval = val; 2239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 2240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_NUMBER); 2241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cache->miscObjs != NULL) && 2244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cache->miscObjs->number != 0)) 2245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 2246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 2247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) 2249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->miscObjs->items[--cache->miscObjs->number]; 2250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_NUMBER; 2252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->floatval = val; 2253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 2254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(ctxt, XPATH_NUMBER); 2255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNewFloat(val)); 2260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheConvertString: 2264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 2265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: an XPath object 2266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathConvertString(). 2268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its string() equivalent 2269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a created or reused object, the old one is freed (cached) 2271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (or the operation is done directly on @val) 2272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr 2275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheConvertString(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) { 2276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *res = NULL; 2277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 2279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCacheNewCString(ctxt, "")); 2280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (val->type) { 2282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 2283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 2284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "STRING: undefined\n"); 2285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 2288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 2289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathCastNodeSetToString(val->nodesetval); 2290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 2292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(val); 2293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 2294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathCastBooleanToString(val->boolval); 2295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 2297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathCastNumberToString(val->floatval); 2298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 2300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 2301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 2302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 2303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO; 2304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt, val); 2307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res == NULL) 2308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCacheNewCString(ctxt, "")); 2309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCacheWrapString(ctxt, res)); 2310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheObjectCopy: 2314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 2315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the original object 2316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathObjectCopy(). 2318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Acquire a copy of a given object 2319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a created or reused created object. 2321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr 2323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheObjectCopy(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) 2324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 2326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (XP_HAS_CACHE(ctxt)) { 2329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (val->type) { 2330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 2331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCacheWrapNodeSet(ctxt, 2332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetMerge(NULL, val->nodesetval))); 2333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 2334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCacheNewString(ctxt, val->stringval)); 2335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 2336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCacheNewBoolean(ctxt, val->boolval)); 2337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 2338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCacheNewFloat(ctxt, val->floatval)); 2339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 2340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathObjectCopy(val)); 2344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheConvertBoolean: 2348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 2349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: an XPath object 2350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathConvertBoolean(). 2352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its boolean() equivalent 2353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a created or reused object, the old one is freed (or the operation 2355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is done directly on @val) 2356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr 2358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheConvertBoolean(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) { 2359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 2360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 2362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCacheNewBoolean(ctxt, 0)); 2363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val->type == XPATH_BOOLEAN) 2364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(val); 2365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCacheNewBoolean(ctxt, xmlXPathCastToBoolean(val)); 2366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt, val); 2367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCacheConvertNumber: 2372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 2373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: an XPath object 2374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the cached version of xmlXPathConvertNumber(). 2376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its number() equivalent 2377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a created or reused object, the old one is freed (or the operation 2379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is done directly on @val) 2380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathObjectPtr 2382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCacheConvertNumber(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) { 2383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 2384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 2386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCacheNewFloat(ctxt, 0.0)); 2387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val->type == XPATH_NUMBER) 2388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(val); 2389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCacheNewFloat(ctxt, xmlXPathCastToNumber(val)); 2390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt, val); 2391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 2395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parser stacks related functions and macros * 2397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 2399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * valuePop: 2402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath evaluation context 2403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops the top XPath object from the value stack 2405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the XPath object just removed 2407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 2409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectvaluePop(xmlXPathParserContextPtr ctxt) 2410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 2412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->valueNr <= 0)) 2414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 2415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valueNr--; 2416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->valueNr > 0) 2417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value = ctxt->valueTab[ctxt->valueNr - 1]; 2418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value = NULL; 2420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ctxt->valueTab[ctxt->valueNr]; 2421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valueTab[ctxt->valueNr] = NULL; 2422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 2423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * valuePush: 2426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath evaluation context 2427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the XPath object 2428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pushes a new XPath object on top of the value stack 2430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns the number of items on the value stack 2432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectvaluePush(xmlXPathParserContextPtr ctxt, xmlXPathObjectPtr value) 2435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (value == NULL)) return(-1); 2437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->valueNr >= ctxt->valueMax) { 2438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr *tmp; 2439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlXPathObjectPtr *) xmlRealloc(ctxt->valueTab, 2441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2 * ctxt->valueMax * 2442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(ctxt->valueTab[0])); 2443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 2444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "realloc failed !\n"); 2445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 2446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valueMax *= 2; 2448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valueTab = tmp; 2449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valueTab[ctxt->valueNr] = value; 2451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value = value; 2452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ctxt->valueNr++); 2453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPopBoolean: 2457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath parser context 2458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops a boolean from the stack, handling conversion if needed. 2460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check error with #xmlXPathCheckError. 2461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the boolean 2463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPopBoolean (xmlXPathParserContextPtr ctxt) { 2466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr obj; 2467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 2468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 2470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj == NULL) { 2471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND); 2472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->type != XPATH_BOOLEAN) 2475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastToBoolean(obj); 2476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = obj->boolval; 2478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 2479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPopNumber: 2484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath parser context 2485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops a number from the stack, handling conversion if needed. 2487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check error with #xmlXPathCheckError. 2488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number 2490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble 2492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPopNumber (xmlXPathParserContextPtr ctxt) { 2493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr obj; 2494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double ret; 2495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 2497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj == NULL) { 2498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND); 2499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->type != XPATH_NUMBER) 2502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastToNumber(obj); 2503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = obj->floatval; 2505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 2506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPopString: 2511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath parser context 2512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops a string from the stack, handling conversion if needed. 2514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check error with #xmlXPathCheckError. 2515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the string 2517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar * 2519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPopString (xmlXPathParserContextPtr ctxt) { 2520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr obj; 2521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar * ret; 2522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 2524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj == NULL) { 2525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND); 2526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastToString(obj); /* this does required strdup */ 2529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO: needs refactoring somewhere else */ 2530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->stringval == ret) 2531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj->stringval = NULL; 2532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 2533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPopNodeSet: 2538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath parser context 2539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops a node-set from the stack, handling conversion if needed. 2541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check error with #xmlXPathCheckError. 2542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the node-set 2544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 2546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPopNodeSet (xmlXPathParserContextPtr ctxt) { 2547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr obj; 2548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ret; 2549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return(NULL); 2551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == NULL) { 2552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND); 2553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlXPathStackIsNodeSet(ctxt)) { 2556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathSetTypeError(ctxt); 2557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 2560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = obj->nodesetval; 2561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 2562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* to fix memory leak of not clearing obj->user */ 2563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->boolval && obj->user != NULL) 2564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeNodeList((xmlNodePtr) obj->user); 2565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj->nodesetval = NULL; 2567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 2568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPopExternal: 2573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath parser context 2574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops an external object from the stack, handling conversion if needed. 2576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check error with #xmlXPathCheckError. 2577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the object 2579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid * 2581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPopExternal (xmlXPathParserContextPtr ctxt) { 2582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr obj; 2583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void * ret; 2584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->value == NULL)) { 2586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND); 2587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->type != XPATH_USERS) { 2590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathSetTypeError(ctxt); 2591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 2594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = obj->user; 2595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj->user = NULL; 2596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 2597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 2601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Macros for accessing the content. Those should be used only by the parser, 2602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and not exported. 2603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dirty macros, i.e. one need to make assumption on the context to use them 2605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * CUR_PTR return the current pointer to the xmlChar to be parsed. 2607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * CUR returns the current xmlChar value, i.e. a 8 bit value 2608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in ISO-Latin or UTF-8. 2609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This should be used internally by the parser 2610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * only to compare to ASCII values otherwise it would break when 2611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * running with UTF-8 encoding. 2612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NXT(n) returns the n'th next xmlChar. Same as CUR is should be used only 2613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to compare on ASCII based substring. 2614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SKIP(n) Skip n xmlChar, and must also be used only to skip ASCII defined 2615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * strings within the parser. 2616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * CURRENT Returns the current char value, with the full decoding of 2617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * UTF-8 if we are using this mode. It returns an int. 2618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NEXT Skip to the next character, this does the proper decoding 2619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in UTF-8 mode. It also pop-up unfinished entities on the fly. 2620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * It returns the pointer to the current xmlChar. 2621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR (*ctxt->cur) 2624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SKIP(val) ctxt->cur += (val) 2625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NXT(val) ctxt->cur[(val)] 2626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR_PTR ctxt->cur 2627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR_CHAR(l) xmlXPathCurrentChar(ctxt, &l) 2628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define COPY_BUF(l,b,i,v) \ 2630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (l == 1) b[i++] = (xmlChar) v; \ 2631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else i += xmlCopyChar(l,&b[i],v) 2632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NEXTL(l) ctxt->cur += l 2634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SKIP_BLANKS \ 2636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*(ctxt->cur))) NEXT 2637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CURRENT (*ctxt->cur) 2639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NEXT ((*ctxt->cur) ? ctxt->cur++: ctxt->cur) 2640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef DBL_DIG 2643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DBL_DIG 16 2644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef DBL_EPSILON 2646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DBL_EPSILON 1E-9 2647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define UPPER_DOUBLE 1E9 2650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define LOWER_DOUBLE 1E-5 2651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define LOWER_DOUBLE_EXP 5 2652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define INTEGER_DIGITS DBL_DIG 2654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FRACTION_DIGITS (DBL_DIG + 1 + (LOWER_DOUBLE_EXP)) 2655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define EXPONENT_DIGITS (3 + 2) 2656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFormatNumber: 2659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @number: number to format 2660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer: output buffer 2661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffersize: size of output buffer 2662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Convert the number into a string representation. 2664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 2666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFormatNumber(double number, char buffer[], int buffersize) 2667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (xmlXPathIsInf(number)) { 2669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 1: 2670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buffersize > (int)sizeof("Infinity")) 2671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(buffer, buffersize, "Infinity"); 2672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case -1: 2674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buffersize > (int)sizeof("-Infinity")) 2675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(buffer, buffersize, "-Infinity"); 2676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 2678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsNaN(number)) { 2679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buffersize > (int)sizeof("NaN")) 2680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(buffer, buffersize, "NaN"); 2681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (number == 0 && xmlXPathGetSign(number) != 0) { 2682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(buffer, buffersize, "0"); 2683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (number == ((int) number)) { 2684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char work[30]; 2685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *ptr, *cur; 2686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int value = (int) number; 2687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ptr = &buffer[0]; 2689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value == 0) { 2690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *ptr++ = '0'; 2691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(work, 29, "%d", value); 2693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = &work[0]; 2694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur) && (ptr - buffer < buffersize)) { 2695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *ptr++ = *cur++; 2696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ptr - buffer < buffersize) { 2699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *ptr = 0; 2700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (buffersize > 0) { 2701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ptr--; 2702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *ptr = 0; 2703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project For the dimension of work, 2707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DBL_DIG is number of significant digits 2708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project EXPONENT is only needed for "scientific notation" 2709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3 is sign, decimal point, and terminating zero 2710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project LOWER_DOUBLE_EXP is max number of leading zeroes in fraction 2711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project Note that this dimension is slightly (a few characters) 2712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project larger than actually necessary. 2713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char work[DBL_DIG + EXPONENT_DIGITS + 3 + LOWER_DOUBLE_EXP]; 2715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int integer_place, fraction_place; 2716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *ptr; 2717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *after_fraction; 2718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double absolute_value; 2719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int size; 2720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project absolute_value = fabs(number); 2722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * First choose format - scientific or regular floating point. 2725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In either case, result is in work, and after_fraction points 2726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * just past the fractional part. 2727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( ((absolute_value > UPPER_DOUBLE) || 2729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (absolute_value < LOWER_DOUBLE)) && 2730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (absolute_value != 0.0) ) { 2731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Use scientific notation */ 2732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project integer_place = DBL_DIG + EXPONENT_DIGITS + 1; 2733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fraction_place = DBL_DIG - 1; 2734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project size = snprintf(work, sizeof(work),"%*.*e", 2735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project integer_place, fraction_place, number); 2736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((size > 0) && (work[size] != 'e')) size--; 2737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 2740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Use regular notation */ 2741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (absolute_value > 0.0) { 2742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project integer_place = (int)log10(absolute_value); 2743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (integer_place > 0) 2744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fraction_place = DBL_DIG - integer_place - 1; 2745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fraction_place = DBL_DIG - integer_place; 2747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fraction_place = 1; 2749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project size = snprintf(work, sizeof(work), "%0.*f", 2751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fraction_place, number); 2752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Remove fractional trailing zeroes */ 2755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project after_fraction = work + size; 2756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ptr = after_fraction; 2757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*(--ptr) == '0') 2758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ; 2759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*ptr != '.') 2760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ptr++; 2761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*ptr++ = *after_fraction++) != 0); 2762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Finally copy result back to caller */ 2764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project size = strlen(work) + 1; 2765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (size > buffersize) { 2766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project work[buffersize - 1] = 0; 2767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project size = buffersize; 2768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memmove(buffer, work, size); 2770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 2777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Routines to handle NodeSets * 2779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 2781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathOrderDocElems: 2784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: an input document 2785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Call this routine to speed up XPath computation on static documents. 2787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This stamps all the element nodes with the document order 2788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Like for line information, the order is kept in the element->content 2789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * field, the value stored is actually - the node number (starting at -1) 2790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to be able to differentiate from line numbers. 2791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of elements found in the document or -1 in case 2793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of error. 2794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectlong 2796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathOrderDocElems(xmlDocPtr doc) { 2797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project long count = 0; 2798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur; 2799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) 2801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = doc->children; 2803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 2804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_ELEMENT_NODE) { 2805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->content = (void *) (-(++count)); 2806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->children != NULL) { 2807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->children; 2808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) { 2812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 2813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 2814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 2816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->parent; 2817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 2818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == (xmlNodePtr) doc) { 2820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = NULL; 2821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) { 2824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 2825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (cur != NULL); 2828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(count); 2830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCmpNodes: 2834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node1: the first node 2835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node2: the second node 2836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare two nodes w.r.t document order 2838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -2 in case of error 1 if first point < second point, 0 if 2840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it's the same node, -1 otherwise 2841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCmpNodes(xmlNodePtr node1, xmlNodePtr node2) { 2844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int depth1, depth2; 2845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int attr1 = 0, attr2 = 0; 2846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr attrNode1 = NULL, attrNode2 = NULL; 2847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur, root; 2848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node1 == NULL) || (node2 == NULL)) 2850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-2); 2851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a couple of optimizations which will avoid computations in most cases 2853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1 == node2) /* trivial case */ 2855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1->type == XML_ATTRIBUTE_NODE) { 2857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr1 = 1; 2858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrNode1 = node1; 2859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node1 = node1->parent; 2860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node2->type == XML_ATTRIBUTE_NODE) { 2862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr2 = 1; 2863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attrNode2 = node2; 2864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node2 = node2->parent; 2865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1 == node2) { 2867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr1 == attr2) { 2868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* not required, but we keep attributes in order */ 2869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr1 != 0) { 2870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = attrNode2->prev; 2871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 2872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == attrNode1) 2873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 2874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->prev; 2875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 2877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr2 == 1) 2881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node1->type == XML_NAMESPACE_DECL) || 2885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node2->type == XML_NAMESPACE_DECL)) 2886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1 == node2->prev) 2888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1 == node2->next) 2890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Speedup using document order if availble. 2894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node1->type == XML_ELEMENT_NODE) && 2896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node2->type == XML_ELEMENT_NODE) && 2897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (0 > (long) node1->content) && 2898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (0 > (long) node2->content) && 2899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node1->doc == node2->doc)) { 2900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project long l1, l2; 2901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l1 = -((long) node1->content); 2903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l2 = -((long) node2->content); 2904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (l1 < l2) 2905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (l1 > l2) 2907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * compute depth to root 2912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (depth2 = 0, cur = node2;cur->parent != NULL;cur = cur->parent) { 2914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == node1) 2915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth2++; 2917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = cur; 2919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (depth1 = 0, cur = node1;cur->parent != NULL;cur = cur->parent) { 2920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == node2) 2921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth1++; 2923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Distinct document (or distinct entities :-( ) case. 2926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root != cur) { 2928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-2); 2929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * get the nearest common ancestor. 2932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (depth1 > depth2) { 2934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth1--; 2935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node1 = node1->parent; 2936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (depth2 > depth1) { 2938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth2--; 2939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node2 = node2->parent; 2940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (node1->parent != node2->parent) { 2942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node1 = node1->parent; 2943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node2 = node2->parent; 2944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* should not happen but just in case ... */ 2945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node1 == NULL) || (node2 == NULL)) 2946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-2); 2947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find who's first. 2950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1 == node2->prev) 2952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1 == node2->next) 2954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Speedup using document order if availble. 2957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node1->type == XML_ELEMENT_NODE) && 2959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node2->type == XML_ELEMENT_NODE) && 2960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (0 > (long) node1->content) && 2961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (0 > (long) node2->content) && 2962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node1->doc == node2->doc)) { 2963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project long l1, l2; 2964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l1 = -((long) node1->content); 2966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l2 = -((long) node2->content); 2967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (l1 < l2) 2968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (l1 > l2) 2970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (cur = node1->next;cur != NULL;cur = cur->next) 2974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == node2) 2975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); /* assume there is no sibling list corruption */ 2977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON 2980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCmpNodesExt: 2982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node1: the first node 2983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node2: the second node 2984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare two nodes w.r.t document order. 2986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This one is optimized for handling of non-element nodes. 2987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -2 in case of error 1 if first point < second point, 0 if 2989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it's the same node, -1 otherwise 2990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 2992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCmpNodesExt(xmlNodePtr node1, xmlNodePtr node2) { 2993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int depth1, depth2; 2994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int misc = 0, precedence1 = 0, precedence2 = 0; 2995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr miscNode1 = NULL, miscNode2 = NULL; 2996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur, root; 2997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project long l1, l2; 2998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node1 == NULL) || (node2 == NULL)) 3000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-2); 3001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1 == node2) 3003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a couple of optimizations which will avoid computations in most cases 3007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (node1->type) { 3009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 3010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node2->type == XML_ELEMENT_NODE) { 3011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((0 > (long) node1->content) && /* TODO: Would a != 0 suffice here? */ 3012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (0 > (long) node2->content) && 3013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node1->doc == node2->doc)) 3014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 3015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l1 = -((long) node1->content); 3016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l2 = -((long) node2->content); 3017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (l1 < l2) 3018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (l1 > l2) 3020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto turtle_comparison; 3023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: 3026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project precedence1 = 1; /* element is owner */ 3027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project miscNode1 = node1; 3028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node1 = node1->parent; 3029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project misc = 1; 3030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 3032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 3033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 3034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: { 3035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project miscNode1 = node1; 3036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find nearest element node. 3038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1->prev != NULL) { 3040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 3041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node1 = node1->prev; 3042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1->type == XML_ELEMENT_NODE) { 3043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project precedence1 = 3; /* element in prev-sibl axis */ 3044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1->prev == NULL) { 3047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project precedence1 = 2; /* element is parent */ 3048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * URGENT TODO: Are there any cases, where the 3050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parent of such a node is not an element node? 3051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node1 = node1->parent; 3053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (1); 3056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project precedence1 = 2; /* element is parent */ 3058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node1 = node1->parent; 3059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node1 == NULL) || (node1->type != XML_ELEMENT_NODE) || 3061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (0 <= (long) node1->content)) { 3062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Fallback for whatever case. 3064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node1 = miscNode1; 3066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project precedence1 = 0; 3067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project misc = 1; 3069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: 3072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: why do we return 1 for namespace nodes? 3074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 3077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (node2->type) { 3080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 3081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: 3083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project precedence2 = 1; /* element is owner */ 3084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project miscNode2 = node2; 3085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node2 = node2->parent; 3086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project misc = 1; 3087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 3089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 3090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 3091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: { 3092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project miscNode2 = node2; 3093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node2->prev != NULL) { 3094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 3095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node2 = node2->prev; 3096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node2->type == XML_ELEMENT_NODE) { 3097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project precedence2 = 3; /* element in prev-sibl axis */ 3098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node2->prev == NULL) { 3101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project precedence2 = 2; /* element is parent */ 3102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node2 = node2->parent; 3103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (1); 3106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project precedence2 = 2; /* element is parent */ 3108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node2 = node2->parent; 3109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node2 == NULL) || (node2->type != XML_ELEMENT_NODE) || 3111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (0 <= (long) node1->content)) 3112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 3113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node2 = miscNode2; 3114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project precedence2 = 0; 3115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project misc = 1; 3117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: 3120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 3122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (misc) { 3125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1 == node2) { 3126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (precedence1 == precedence2) { 3127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The ugly case; but normally there aren't many 3129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * adjacent non-element nodes around. 3130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = miscNode2->prev; 3132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 3133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == miscNode1) 3134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_ELEMENT_NODE) 3136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->prev; 3138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 3140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate based on higher precedence wrt to the element. 3143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: This assumes attributes are sorted before content. 3144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Is this 100% correct? 3145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (precedence1 < precedence2) 3147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 3149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Special case: One of the helper-elements is contained by the other. 3154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * <foo> 3155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * <node2> 3156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * <node1>Text-1(precedence1 == 2)</node1> 3157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * </node2> 3158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Text-6(precedence2 == 3) 3159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * </foo> 3160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((precedence2 == 3) && (precedence1 > 1)) { 3162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = node1->parent; 3163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur) { 3164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == node2) 3165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->parent; 3167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((precedence1 == 3) && (precedence2 > 1)) { 3170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = node2->parent; 3171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur) { 3172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == node1) 3173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->parent; 3175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Speedup using document order if availble. 3181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node1->type == XML_ELEMENT_NODE) && 3183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node2->type == XML_ELEMENT_NODE) && 3184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (0 > (long) node1->content) && 3185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (0 > (long) node2->content) && 3186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node1->doc == node2->doc)) { 3187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l1 = -((long) node1->content); 3189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l2 = -((long) node2->content); 3190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (l1 < l2) 3191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (l1 > l2) 3193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectturtle_comparison: 3197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1 == node2->prev) 3199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1 == node2->next) 3201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * compute depth to root 3204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (depth2 = 0, cur = node2;cur->parent != NULL;cur = cur->parent) { 3206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == node1) 3207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth2++; 3209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = cur; 3211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (depth1 = 0, cur = node1;cur->parent != NULL;cur = cur->parent) { 3212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == node2) 3213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth1++; 3215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Distinct document (or distinct entities :-( ) case. 3218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root != cur) { 3220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-2); 3221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * get the nearest common ancestor. 3224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (depth1 > depth2) { 3226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth1--; 3227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node1 = node1->parent; 3228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (depth2 > depth1) { 3230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth2--; 3231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node2 = node2->parent; 3232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (node1->parent != node2->parent) { 3234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node1 = node1->parent; 3235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node2 = node2->parent; 3236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* should not happen but just in case ... */ 3237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node1 == NULL) || (node2 == NULL)) 3238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-2); 3239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find who's first. 3242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1 == node2->prev) 3244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node1 == node2->next) 3246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Speedup using document order if availble. 3249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node1->type == XML_ELEMENT_NODE) && 3251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node2->type == XML_ELEMENT_NODE) && 3252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (0 > (long) node1->content) && 3253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (0 > (long) node2->content) && 3254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node1->doc == node2->doc)) { 3255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l1 = -((long) node1->content); 3257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l2 = -((long) node2->content); 3258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (l1 < l2) 3259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (l1 > l2) 3261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 3262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (cur = node1->next;cur != NULL;cur = cur->next) 3265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == node2) 3266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); /* assume there is no sibling list corruption */ 3268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* XP_OPTIMIZED_NON_ELEM_COMPARISON */ 3270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetSort: 3273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set: the node set 3274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Sort the node set in document order 3276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 3278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetSort(xmlNodeSetPtr set) { 3279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j, incr, len; 3280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr tmp; 3281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set == NULL) 3283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Use Shell's sort to sort the node-set */ 3286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = set->nodeNr; 3287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (incr = len / 2; incr > 0; incr /= 2) { 3288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = incr; i < len; i++) { 3289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project j = i - incr; 3290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (j >= 0) { 3291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON 3292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathCmpNodesExt(set->nodeTab[j], 3293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set->nodeTab[j + incr]) == -1) 3294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 3295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathCmpNodes(set->nodeTab[j], 3296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set->nodeTab[j + incr]) == -1) 3297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 3299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = set->nodeTab[j]; 3300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set->nodeTab[j] = set->nodeTab[j + incr]; 3301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set->nodeTab[j + incr] = tmp; 3302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project j -= incr; 3303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_NODESET_DEFAULT 10 3311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetDupNs: 3313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the parent node of the namespace XPath node 3314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: the libxml namespace declaration node. 3315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Namespace node in libxml don't match the XPath semantic. In a node set 3317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the namespace nodes are duplicated and the next pointer is set to the 3318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parent node in the XPath semantic. 3319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 3321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr 3323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetDupNs(xmlNodePtr node, xmlNsPtr ns) { 3324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr cur; 3325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns == NULL) || (ns->type != XML_NAMESPACE_DECL)) 3327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node == NULL) || (node->type == XML_NAMESPACE_DECL)) 3329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlNodePtr) ns); 3330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new Namespace and fill the fields. 3333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = (xmlNsPtr) xmlMalloc(sizeof(xmlNs)); 3335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 3336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "duplicating namespace\n"); 3337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur, 0, sizeof(xmlNs)); 3340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_NAMESPACE_DECL; 3341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns->href != NULL) 3342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->href = xmlStrdup(ns->href); 3343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns->prefix != NULL) 3344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->prefix = xmlStrdup(ns->prefix); 3345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->next = (xmlNsPtr) node; 3346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlNodePtr) cur); 3347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetFreeNs: 3351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: the XPath namespace node found in a nodeset. 3352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Namespace nodes in libxml don't match the XPath semantic. In a node set 3354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the namespace nodes are duplicated and the next pointer is set to the 3355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parent node in the XPath semantic. Check if such a node needs to be freed 3356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 3358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetFreeNs(xmlNsPtr ns) { 3359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns == NULL) || (ns->type != XML_NAMESPACE_DECL)) 3360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns->next != NULL) && (ns->next->type != XML_NAMESPACE_DECL)) { 3363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns->href != NULL) 3364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *)ns->href); 3365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns->prefix != NULL) 3366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *)ns->prefix); 3367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ns); 3368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetCreate: 3373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: an initial xmlNodePtr, or NULL 3374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlNodeSetPtr of type double and of value @val 3376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 3378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 3380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetCreate(xmlNodePtr val) { 3381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ret; 3382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlNodeSetPtr) xmlMalloc(sizeof(xmlNodeSet)); 3384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 3385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating nodeset\n"); 3386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlNodeSet)); 3389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val != NULL) { 3390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * 3391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlNodePtr)); 3392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->nodeTab == NULL) { 3393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating nodeset\n"); 3394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 3395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret->nodeTab, 0 , 3398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); 3399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodeMax = XML_NODESET_DEFAULT; 3400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val->type == XML_NAMESPACE_DECL) { 3401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns = (xmlNsPtr) val; 3402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodeTab[ret->nodeNr++] = 3404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); 3405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodeTab[ret->nodeNr++] = val; 3407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 3409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetCreateSize: 3413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size: the initial size of the set 3414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlNodeSetPtr of type double and of value @val 3416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 3418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodeSetPtr 3420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetCreateSize(int size) { 3421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ret; 3422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlNodeSetPtr) xmlMalloc(sizeof(xmlNodeSet)); 3424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 3425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating nodeset\n"); 3426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlNodeSet)); 3429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (size < XML_NODESET_DEFAULT) 3430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project size = XML_NODESET_DEFAULT; 3431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodeTab = (xmlNodePtr *) xmlMalloc(size * sizeof(xmlNodePtr)); 3432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->nodeTab == NULL) { 3433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating nodeset\n"); 3434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 3435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret->nodeTab, 0 , size * (size_t) sizeof(xmlNodePtr)); 3438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodeMax = size; 3439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 3440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetContains: 3444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the node-set 3445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the node 3446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * checks whether @cur contains @val 3448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns true (1) if @cur contains @val, false (0) otherwise 3450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 3452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetContains (xmlNodeSetPtr cur, xmlNodePtr val) { 3453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 3454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == NULL) || (val == NULL)) return(0); 3456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val->type == XML_NAMESPACE_DECL) { 3457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < cur->nodeNr; i++) { 3458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodeTab[i]->type == XML_NAMESPACE_DECL) { 3459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns1, ns2; 3460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns1 = (xmlNsPtr) val; 3462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns2 = (xmlNsPtr) cur->nodeTab[i]; 3463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns1 == ns2) 3464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns1->next != NULL) && (ns2->next == ns1->next) && 3466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(ns1->prefix, ns2->prefix))) 3467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < cur->nodeNr; i++) { 3472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodeTab[i] == val) 3473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 3474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 3477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetAddNs: 3481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the initial node set 3482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the hosting node 3483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: a the namespace node 3484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * add a new namespace node to an existing NodeSet 3486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 3488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetAddNs(xmlNodeSetPtr cur, xmlNodePtr node, xmlNsPtr ns) { 3489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 3490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == NULL) || (ns == NULL) || (node == NULL) || 3493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ns->type != XML_NAMESPACE_DECL) || 3494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type != XML_ELEMENT_NODE)) 3495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* @@ with_ns to check whether namespace nodes should be looked at @@ */ 3498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * prevent duplicates 3500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < cur->nodeNr;i++) { 3502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->nodeTab[i] != NULL) && 3503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->nodeTab[i]->type == XML_NAMESPACE_DECL) && 3504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (((xmlNsPtr)cur->nodeTab[i])->next == (xmlNsPtr) node) && 3505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(ns->prefix, ((xmlNsPtr)cur->nodeTab[i])->prefix))) 3506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * grow the nodeTab if needed 3511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodeMax == 0) { 3513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * 3514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlNodePtr)); 3515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodeTab == NULL) { 3516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "growing nodeset\n"); 3517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur->nodeTab, 0 , 3520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); 3521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeMax = XML_NODESET_DEFAULT; 3522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->nodeNr == cur->nodeMax) { 3523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr *temp; 3524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeMax *= 2; 3526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project temp = (xmlNodePtr *) xmlRealloc(cur->nodeTab, cur->nodeMax * 3527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlNodePtr)); 3528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (temp == NULL) { 3529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "growing nodeset\n"); 3530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab = temp; 3533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab[cur->nodeNr++] = xmlXPathNodeSetDupNs(node, ns); 3535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetAdd: 3539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the initial node set 3540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: a new xmlNodePtr 3541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * add a new xmlNodePtr to an existing NodeSet 3543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 3545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetAdd(xmlNodeSetPtr cur, xmlNodePtr val) { 3546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 3547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == NULL) || (val == NULL)) return; 3549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 3551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((val->type == XML_ELEMENT_NODE) && (val->name[0] == ' ')) 3552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; /* an XSLT fake node */ 3553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* @@ with_ns to check whether namespace nodes should be looked at @@ */ 3556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * prevent duplcates 3558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < cur->nodeNr;i++) 3560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodeTab[i] == val) return; 3561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * grow the nodeTab if needed 3564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodeMax == 0) { 3566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * 3567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlNodePtr)); 3568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodeTab == NULL) { 3569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "growing nodeset\n"); 3570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur->nodeTab, 0 , 3573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); 3574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeMax = XML_NODESET_DEFAULT; 3575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->nodeNr == cur->nodeMax) { 3576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr *temp; 3577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeMax *= 2; 3579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project temp = (xmlNodePtr *) xmlRealloc(cur->nodeTab, cur->nodeMax * 3580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlNodePtr)); 3581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (temp == NULL) { 3582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "growing nodeset\n"); 3583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab = temp; 3586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val->type == XML_NAMESPACE_DECL) { 3588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns = (xmlNsPtr) val; 3589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab[cur->nodeNr++] = 3591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); 3592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab[cur->nodeNr++] = val; 3594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetAddUnique: 3598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the initial node set 3599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: a new xmlNodePtr 3600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * add a new xmlNodePtr to an existing NodeSet, optimized version 3602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * when we are sure the node is not already in the set. 3603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 3605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetAddUnique(xmlNodeSetPtr cur, xmlNodePtr val) { 3606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == NULL) || (val == NULL)) return; 3607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 3609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((val->type == XML_ELEMENT_NODE) && (val->name[0] == ' ')) 3610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; /* an XSLT fake node */ 3611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* @@ with_ns to check whether namespace nodes should be looked at @@ */ 3614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * grow the nodeTab if needed 3616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodeMax == 0) { 3618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * 3619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlNodePtr)); 3620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodeTab == NULL) { 3621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "growing nodeset\n"); 3622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur->nodeTab, 0 , 3625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); 3626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeMax = XML_NODESET_DEFAULT; 3627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->nodeNr == cur->nodeMax) { 3628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr *temp; 3629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeMax *= 2; 3631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project temp = (xmlNodePtr *) xmlRealloc(cur->nodeTab, cur->nodeMax * 3632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlNodePtr)); 3633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (temp == NULL) { 3634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "growing nodeset\n"); 3635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 3636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab = temp; 3638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val->type == XML_NAMESPACE_DECL) { 3640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns = (xmlNsPtr) val; 3641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab[cur->nodeNr++] = 3643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); 3644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab[cur->nodeNr++] = val; 3646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetMerge: 3650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val1: the first NodeSet or NULL 3651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val2: the second NodeSet 3652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Merges two nodesets, all nodes from @val2 are added to @val1 3654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if @val1 is NULL, a new set is created and copied from @val2 3655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns @val1 once extended or NULL in case of error. 3657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 3659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetMerge(xmlNodeSetPtr val1, xmlNodeSetPtr val2) { 3660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j, initNr, skip; 3661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr n1, n2; 3662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val2 == NULL) return(val1); 3664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val1 == NULL) { 3665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1 = xmlXPathNodeSetCreate(NULL); 3666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 3667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: The optimization won't work in every case, since 3669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * those nasty namespace nodes need to be added with 3670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetDupNs() to the set; thus a pure 3671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * memcpy is not possible. 3672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If there was a flag on the nodesetval, indicating that 3673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * some temporary nodes are in, that would be helpfull. 3674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Optimization: Create an equally sized node-set 3677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and memcpy the content. 3678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1 = xmlXPathNodeSetCreateSize(val2->nodeNr); 3680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val1 == NULL) 3681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val2->nodeNr != 0) { 3683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val2->nodeNr == 1) 3684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *(val1->nodeTab) = *(val2->nodeTab); 3685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 3686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(val1->nodeTab, val2->nodeTab, 3687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val2->nodeNr * sizeof(xmlNodePtr)); 3688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1->nodeNr = val2->nodeNr; 3690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(val1); 3692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 3693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* @@ with_ns to check whether namespace nodes should be looked at @@ */ 3696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project initNr = val1->nodeNr; 3697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < val2->nodeNr;i++) { 3699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project n2 = val2->nodeTab[i]; 3700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check against duplicates 3702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project skip = 0; 3704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0; j < initNr; j++) { 3705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project n1 = val1->nodeTab[j]; 3706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (n1 == n2) { 3707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project skip = 1; 3708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((n1->type == XML_NAMESPACE_DECL) && 3710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (n2->type == XML_NAMESPACE_DECL)) { 3711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((((xmlNsPtr) n1)->next == ((xmlNsPtr) n2)->next) && 3712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(((xmlNsPtr) n1)->prefix, 3713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlNsPtr) n2)->prefix))) 3714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 3715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project skip = 1; 3716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 3717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (skip) 3721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 3722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * grow the nodeTab if needed 3725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val1->nodeMax == 0) { 3727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * 3728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlNodePtr)); 3729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val1->nodeTab == NULL) { 3730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "merging nodeset\n"); 3731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(val1->nodeTab, 0 , 3734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); 3735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1->nodeMax = XML_NODESET_DEFAULT; 3736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (val1->nodeNr == val1->nodeMax) { 3737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr *temp; 3738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1->nodeMax *= 2; 3740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project temp = (xmlNodePtr *) xmlRealloc(val1->nodeTab, val1->nodeMax * 3741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlNodePtr)); 3742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (temp == NULL) { 3743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "merging nodeset\n"); 3744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1->nodeTab = temp; 3747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (n2->type == XML_NAMESPACE_DECL) { 3749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns = (xmlNsPtr) n2; 3750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1->nodeTab[val1->nodeNr++] = 3752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); 3753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1->nodeTab[val1->nodeNr++] = n2; 3755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(val1); 3758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 /* xmlXPathNodeSetMergeUnique() is currently not used anymore */ 3761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetMergeUnique: 3763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val1: the first NodeSet or NULL 3764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val2: the second NodeSet 3765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Merges two nodesets, all nodes from @val2 are added to @val1 3767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if @val1 is NULL, a new set is created and copied from @val2 3768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns @val1 once extended or NULL in case of error. 3770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodeSetPtr 3772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetMergeUnique(xmlNodeSetPtr val1, xmlNodeSetPtr val2) { 3773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 3774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val2 == NULL) return(val1); 3776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val1 == NULL) { 3777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1 = xmlXPathNodeSetCreate(NULL); 3778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* @@ with_ns to check whether namespace nodes should be looked at @@ */ 3781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < val2->nodeNr;i++) { 3783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * grow the nodeTab if needed 3785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val1->nodeMax == 0) { 3787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * 3788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlNodePtr)); 3789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val1->nodeTab == NULL) { 3790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "merging nodeset\n"); 3791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(val1->nodeTab, 0 , 3794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); 3795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1->nodeMax = XML_NODESET_DEFAULT; 3796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (val1->nodeNr == val1->nodeMax) { 3797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr *temp; 3798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1->nodeMax *= 2; 3800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project temp = (xmlNodePtr *) xmlRealloc(val1->nodeTab, val1->nodeMax * 3801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlNodePtr)); 3802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (temp == NULL) { 3803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "merging nodeset\n"); 3804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1->nodeTab = temp; 3807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val2->nodeTab[i]->type == XML_NAMESPACE_DECL) { 3809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns = (xmlNsPtr) val2->nodeTab[i]; 3810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1->nodeTab[val1->nodeNr++] = 3812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); 3813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1->nodeTab[val1->nodeNr++] = val2->nodeTab[i]; 3815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(val1); 3818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* xmlXPathNodeSetMergeUnique() is currently not used anymore */ 3820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetMergeAndClear: 3823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set1: the first NodeSet or NULL 3824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set2: the second NodeSet 3825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @hasSet2NsNodes: 1 if set2 contains namespaces nodes 3826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Merges two nodesets, all nodes from @set2 are added to @set1 3828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if @set1 is NULL, a new set is created and copied from @set2. 3829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks for duplicate nodes. Clears set2. 3830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns @set1 once extended or NULL in case of error. 3832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodeSetPtr 3834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetMergeAndClear(xmlNodeSetPtr set1, xmlNodeSetPtr set2, 3835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int hasNullEntries) 3836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((set1 == NULL) && (hasNullEntries == 0)) { 3838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that doing a memcpy of the list, namespace nodes are 3840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * just assigned to set1, since set2 is cleared anyway. 3841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1 = xmlXPathNodeSetCreateSize(set2->nodeNr); 3843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set1 == NULL) 3844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set2->nodeNr != 0) { 3846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(set1->nodeTab, set2->nodeTab, 3847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set2->nodeNr * sizeof(xmlNodePtr)); 3848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeNr = set2->nodeNr; 3849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j, initNbSet1; 3852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr n1, n2; 3853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set1 == NULL) 3855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1 = xmlXPathNodeSetCreate(NULL); 3856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project initNbSet1 = set1->nodeNr; 3858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < set2->nodeNr;i++) { 3859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project n2 = set2->nodeTab[i]; 3860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip NULLed entries. 3862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (n2 == NULL) 3864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 3865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip duplicates. 3867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0; j < initNbSet1; j++) { 3869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project n1 = set1->nodeTab[j]; 3870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (n1 == n2) { 3871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_node; 3872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((n1->type == XML_NAMESPACE_DECL) && 3873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (n2->type == XML_NAMESPACE_DECL)) 3874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 3875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((((xmlNsPtr) n1)->next == ((xmlNsPtr) n2)->next) && 3876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(((xmlNsPtr) n1)->prefix, 3877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlNsPtr) n2)->prefix))) 3878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 3879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the namespace node. 3881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set2->nodeTab[i] = NULL; 3883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetFreeNs((xmlNsPtr) n2); 3884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto skip_node; 3885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * grow the nodeTab if needed 3890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set1->nodeMax == 0) { 3892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeTab = (xmlNodePtr *) xmlMalloc( 3893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_NODESET_DEFAULT * sizeof(xmlNodePtr)); 3894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set1->nodeTab == NULL) { 3895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "merging nodeset\n"); 3896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(set1->nodeTab, 0, 3899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); 3900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeMax = XML_NODESET_DEFAULT; 3901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (set1->nodeNr >= set1->nodeMax) { 3902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr *temp; 3903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeMax *= 2; 3905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project temp = (xmlNodePtr *) xmlRealloc( 3906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeTab, set1->nodeMax * sizeof(xmlNodePtr)); 3907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (temp == NULL) { 3908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "merging nodeset\n"); 3909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeTab = temp; 3912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (n2->type == XML_NAMESPACE_DECL) { 3914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns = (xmlNsPtr) n2; 3915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeTab[set1->nodeNr++] = 3917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); 3918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 3919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeTab[set1->nodeNr++] = n2; 3920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectskip_node: 3921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project {} 3922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set2->nodeNr = 0; 3925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(set1); 3926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 3927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 3929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetMergeAndClearNoDupls: 3930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set1: the first NodeSet or NULL 3931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set2: the second NodeSet 3932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @hasSet2NsNodes: 1 if set2 contains namespaces nodes 3933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Merges two nodesets, all nodes from @set2 are added to @set1 3935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if @set1 is NULL, a new set is created and copied from @set2. 3936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Doesn't chack for duplicate nodes. Clears set2. 3937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns @set1 once extended or NULL in case of error. 3939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodeSetPtr 3941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetMergeAndClearNoDupls(xmlNodeSetPtr set1, xmlNodeSetPtr set2, 3942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int hasNullEntries) 3943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 3944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set2 == NULL) 3945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(set1); 3946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((set1 == NULL) && (hasNullEntries == 0)) { 3947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that doing a memcpy of the list, namespace nodes are 3949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * just assigned to set1, since set2 is cleared anyway. 3950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1 = xmlXPathNodeSetCreateSize(set2->nodeNr); 3952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set1 == NULL) 3953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set2->nodeNr != 0) { 3955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(set1->nodeTab, set2->nodeTab, 3956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set2->nodeNr * sizeof(xmlNodePtr)); 3957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeNr = set2->nodeNr; 3958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 3960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 3961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr n2; 3962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set1 == NULL) 3964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1 = xmlXPathNodeSetCreate(NULL); 3965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < set2->nodeNr;i++) { 3967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project n2 = set2->nodeTab[i]; 3968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip NULLed entries. 3970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 3971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (n2 == NULL) 3972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 3973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set1->nodeMax == 0) { 3974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeTab = (xmlNodePtr *) xmlMalloc( 3975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_NODESET_DEFAULT * sizeof(xmlNodePtr)); 3976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set1->nodeTab == NULL) { 3977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "merging nodeset\n"); 3978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(set1->nodeTab, 0, 3981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); 3982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeMax = XML_NODESET_DEFAULT; 3983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (set1->nodeNr >= set1->nodeMax) { 3984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr *temp; 3985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 3986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeMax *= 2; 3987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project temp = (xmlNodePtr *) xmlRealloc( 3988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeTab, set1->nodeMax * sizeof(xmlNodePtr)); 3989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (temp == NULL) { 3990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "merging nodeset\n"); 3991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 3992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeTab = temp; 3994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set1->nodeTab[set1->nodeNr++] = n2; 3996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 3998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set2->nodeNr = 0; 3999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(set1); 4000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetDel: 4004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the initial node set 4005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: an xmlNodePtr 4006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Removes an xmlNodePtr from an existing NodeSet 4008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 4010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetDel(xmlNodeSetPtr cur, xmlNodePtr val) { 4011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 4012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) return; 4014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) return; 4015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * find node in nodeTab 4018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < cur->nodeNr;i++) 4020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodeTab[i] == val) break; 4021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (i >= cur->nodeNr) { /* not found */ 4023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG 4024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 4025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathNodeSetDel: Node %s wasn't found in NodeList\n", 4026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val->name); 4027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->nodeTab[i] != NULL) && 4031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->nodeTab[i]->type == XML_NAMESPACE_DECL)) 4032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetFreeNs((xmlNsPtr) cur->nodeTab[i]); 4033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeNr--; 4034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (;i < cur->nodeNr;i++) 4035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab[i] = cur->nodeTab[i + 1]; 4036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab[cur->nodeNr] = NULL; 4037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetRemove: 4041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the initial node set 4042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the index to remove 4043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Removes an entry from an existing NodeSet list. 4045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 4047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetRemove(xmlNodeSetPtr cur, int val) { 4048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) return; 4049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val >= cur->nodeNr) return; 4050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->nodeTab[val] != NULL) && 4051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->nodeTab[val]->type == XML_NAMESPACE_DECL)) 4052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetFreeNs((xmlNsPtr) cur->nodeTab[val]); 4053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeNr--; 4054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (;val < cur->nodeNr;val++) 4055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab[val] = cur->nodeTab[val + 1]; 4056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeTab[cur->nodeNr] = NULL; 4057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeNodeSet: 4061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj: the xmlNodeSetPtr to free 4062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the NodeSet compound (not the actual nodes !). 4064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 4066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeNodeSet(xmlNodeSetPtr obj) { 4067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj == NULL) return; 4068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodeTab != NULL) { 4069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 4070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* @@ with_ns to check whether namespace nodes should be looked at @@ */ 4072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < obj->nodeNr;i++) 4073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((obj->nodeTab[i] != NULL) && 4074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (obj->nodeTab[i]->type == XML_NAMESPACE_DECL)) 4075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetFreeNs((xmlNsPtr) obj->nodeTab[i]); 4076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(obj->nodeTab); 4077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(obj); 4079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetClear: 4083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set: the node set to clear 4084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Clears the list from all temporary XPath objects (e.g. namespace nodes 4086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * are feed), but does *not* free the list itself. Sets the length of the 4087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * list to 0. 4088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 4090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetClear(xmlNodeSetPtr set, int hasNsNodes) 4091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((set == NULL) || (set->nodeNr <= 0)) 4093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (hasNsNodes) { 4095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 4096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; 4097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < set->nodeNr; i++) { 4099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = set->nodeTab[i]; 4100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node != NULL) && 4101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_NAMESPACE_DECL)) 4102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetFreeNs((xmlNsPtr) node); 4103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set->nodeNr = 0; 4106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetClearFromPos: 4110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set: the node set to be cleared 4111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pos: the start position to clear from 4112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Clears the list from temporary XPath objects (e.g. namespace nodes 4114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * are feed) starting with the entry at @pos, but does *not* free the list 4115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * itself. Sets the length of the list to @pos. 4116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 4118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeSetClearFromPos(xmlNodeSetPtr set, int pos, int hasNsNodes) 4119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((set == NULL) || (set->nodeNr <= 0) || (pos >= set->nodeNr)) 4121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((hasNsNodes)) { 4123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 4124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; 4125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = pos; i < set->nodeNr; i++) { 4127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = set->nodeTab[i]; 4128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node != NULL) && 4129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_NAMESPACE_DECL)) 4130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetFreeNs((xmlNsPtr) node); 4131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set->nodeNr = pos; 4134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeValueTree: 4138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj: the xmlNodeSetPtr to free 4139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the NodeSet compound and the actual tree, this is different 4141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * from xmlXPathFreeNodeSet() 4142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 4144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeValueTree(xmlNodeSetPtr obj) { 4145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 4146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj == NULL) return; 4148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodeTab != NULL) { 4150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < obj->nodeNr;i++) { 4151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodeTab[i] != NULL) { 4152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodeTab[i]->type == XML_NAMESPACE_DECL) { 4153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetFreeNs((xmlNsPtr) obj->nodeTab[i]); 4154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeNodeList(obj->nodeTab[i]); 4156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(obj->nodeTab); 4160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(obj); 4162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(DEBUG) || defined(DEBUG_STEP) 4165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGenericErrorContextNodeSet: 4167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output: a FILE * for the output 4168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj: the xmlNodeSetPtr to display 4169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Quick display of a NodeSet 4171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 4173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGenericErrorContextNodeSet(FILE *output, xmlNodeSetPtr obj) { 4174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 4175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (output == NULL) output = xmlGenericErrorContext; 4177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj == NULL) { 4178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NodeSet == NULL !\n"); 4179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodeNr == 0) { 4182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "NodeSet is empty\n"); 4183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodeTab == NULL) { 4186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " nodeTab == NULL !\n"); 4187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < obj->nodeNr; i++) { 4190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodeTab[i] == NULL) { 4191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " NULL !\n"); 4192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((obj->nodeTab[i]->type == XML_DOCUMENT_NODE) || 4195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (obj->nodeTab[i]->type == XML_HTML_DOCUMENT_NODE)) 4196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " /"); 4197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (obj->nodeTab[i]->name == NULL) 4198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, " noname!"); 4199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else fprintf(output, " %s", obj->nodeTab[i]->name); 4200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(output, "\n"); 4202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewNodeSet: 4207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the NodePtr value 4208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type NodeSet and initialize 4210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it with the single Node @val 4211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 4213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 4215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewNodeSet(xmlNodePtr val) { 4216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 4217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); 4219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 4220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating nodeset\n"); 4221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); 4224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_NODESET; 4225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->boolval = 0; 4226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodesetval = xmlXPathNodeSetCreate(val); 4227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* @@ with_ns to check whether namespace nodes should be looked at @@ */ 4228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 4229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(NULL, XPATH_NODESET); 4230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewValueTree: 4236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the NodePtr value 4237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type Value Tree (XSLT) and initialize 4239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it with the tree root @val 4240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 4242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 4244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewValueTree(xmlNodePtr val) { 4245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 4246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); 4248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 4249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating result value tree\n"); 4250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); 4253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_XSLT_TREE; 4254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->boolval = 1; 4255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->user = (void *) val; 4256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodesetval = xmlXPathNodeSetCreate(val); 4257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 4258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(NULL, XPATH_XSLT_TREE); 4259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewNodeSetList: 4265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: an existing NodeSet 4266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type NodeSet and initialize 4268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it with the Nodeset @val 4269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 4271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 4273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewNodeSetList(xmlNodeSetPtr val) 4274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 4275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 4276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 4277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 4279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = NULL; 4280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (val->nodeTab == NULL) 4281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNewNodeSet(NULL); 4282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 4283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNewNodeSet(val->nodeTab[0]); 4284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 1; i < val->nodeNr; ++i) 4285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique(ret->nodesetval, val->nodeTab[i]); 4286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 4289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathWrapNodeSet: 4293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the NodePtr value 4294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wrap the Nodeset @val in a new xmlXPathObjectPtr 4296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 4298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 4300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathWrapNodeSet(xmlNodeSetPtr val) { 4301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 4302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); 4304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 4305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating node set object\n"); 4306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); 4309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_NODESET; 4310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodesetval = val; 4311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 4312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(NULL, XPATH_NODESET); 4313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeNodeSetList: 4319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj: an existing NodeSetList object 4320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up the xmlXPathObjectPtr @obj but don't deallocate the objects in 4322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the list contrary to xmlXPathFreeObject(). 4323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 4325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeNodeSetList(xmlXPathObjectPtr obj) { 4326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj == NULL) return; 4327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 4328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageReleased(NULL, obj->type); 4329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 4330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(obj); 4331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathDifference: 4335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1: a node-set 4336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2: a node-set 4337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets difference() function: 4339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set set:difference (node-set, node-set) 4340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the difference between the two node sets, or nodes1 if 4342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nodes2 is empty 4343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 4345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDifference (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { 4346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ret; 4347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, l1; 4348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur; 4349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes2)) 4351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(nodes1); 4352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNodeSetCreate(NULL); 4354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes1)) 4355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l1 = xmlXPathNodeSetGetLength(nodes1); 4358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < l1; i++) { 4360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlXPathNodeSetItem(nodes1, i); 4361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlXPathNodeSetContains(nodes2, cur)) 4362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique(ret, cur); 4363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIntersection: 4369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1: a node-set 4370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2: a node-set 4371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets intersection() function: 4373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set set:intersection (node-set, node-set) 4374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a node set comprising the nodes that are within both the 4376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node sets passed as arguments 4377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 4379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIntersection (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { 4380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ret = xmlXPathNodeSetCreate(NULL); 4381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, l1; 4382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur; 4383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes1)) 4385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes2)) 4387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l1 = xmlXPathNodeSetGetLength(nodes1); 4390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < l1; i++) { 4392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlXPathNodeSetItem(nodes1, i); 4393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetContains(nodes2, cur)) 4394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique(ret, cur); 4395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathDistinctSorted: 4401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: a node-set, sorted by document order 4402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets distinct() function: 4404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set set:distinct (node-set) 4405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a subset of the nodes contained in @nodes, or @nodes if 4407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it is empty 4408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 4410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDistinctSorted (xmlNodeSetPtr nodes) { 4411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ret; 4412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashTablePtr hash; 4413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, l; 4414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar * strval; 4415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur; 4416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes)) 4418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(nodes); 4419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNodeSetCreate(NULL); 4421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l = xmlXPathNodeSetGetLength(nodes); 4422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hash = xmlHashCreate (l); 4423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < l; i++) { 4424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlXPathNodeSetItem(nodes, i); 4425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strval = xmlXPathCastNodeToString(cur); 4426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlHashLookup(hash, strval) == NULL) { 4427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashAddEntry(hash, strval, strval); 4428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique(ret, cur); 4429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 4430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(strval); 4431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(hash, (xmlHashDeallocator) xmlFree); 4434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathDistinct: 4439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: a node-set 4440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets distinct() function: 4442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set set:distinct (node-set) 4443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes is sorted by document order, then #exslSetsDistinctSorted 4444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is called with the sorted node-set 4445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a subset of the nodes contained in @nodes, or @nodes if 4447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it is empty 4448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 4450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDistinct (xmlNodeSetPtr nodes) { 4451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes)) 4452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(nodes); 4453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(nodes); 4455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathDistinctSorted(nodes)); 4456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathHasSameNodes: 4460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1: a node-set 4461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2: a node-set 4462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets has-same-nodes function: 4464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * boolean set:has-same-node(node-set, node-set) 4465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns true (1) if @nodes1 shares any node with @nodes2, false (0) 4467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * otherwise 4468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 4470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathHasSameNodes (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { 4471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, l; 4472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur; 4473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes1) || 4475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetIsEmpty(nodes2)) 4476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 4477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l = xmlXPathNodeSetGetLength(nodes1); 4479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < l; i++) { 4480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlXPathNodeSetItem(nodes1, i); 4481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetContains(nodes2, cur)) 4482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 4483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 4485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeLeadingSorted: 4489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: a node-set, sorted by document order 4490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a node 4491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets leading() function: 4493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set set:leading (node-set, node-set) 4494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes that precede @node in document order, 4496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes if @node is NULL or an empty node-set if @nodes 4497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * doesn't contain @node 4498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 4500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeLeadingSorted (xmlNodeSetPtr nodes, xmlNodePtr node) { 4501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, l; 4502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur; 4503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ret; 4504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == NULL) 4506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(nodes); 4507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNodeSetCreate(NULL); 4509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes) || 4510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlXPathNodeSetContains(nodes, node))) 4511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l = xmlXPathNodeSetGetLength(nodes); 4514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < l; i++) { 4515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlXPathNodeSetItem(nodes, i); 4516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == node) 4517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique(ret, cur); 4519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeLeading: 4525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: a node-set 4526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a node 4527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets leading() function: 4529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set set:leading (node-set, node-set) 4530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes is sorted by document order, then #exslSetsNodeLeadingSorted 4531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is called. 4532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes that precede @node in document order, 4534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes if @node is NULL or an empty node-set if @nodes 4535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * doesn't contain @node 4536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 4538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeLeading (xmlNodeSetPtr nodes, xmlNodePtr node) { 4539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(nodes); 4540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNodeLeadingSorted(nodes, node)); 4541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathLeadingSorted: 4545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1: a node-set, sorted by document order 4546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2: a node-set, sorted by document order 4547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets leading() function: 4549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set set:leading (node-set, node-set) 4550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes1 that precede the first node in @nodes2 4552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in document order, @nodes1 if @nodes2 is NULL or empty or 4553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * an empty node-set if @nodes1 doesn't contain @nodes2 4554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 4556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathLeadingSorted (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { 4557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes2)) 4558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(nodes1); 4559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNodeLeadingSorted(nodes1, 4560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetItem(nodes2, 1))); 4561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathLeading: 4565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1: a node-set 4566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2: a node-set 4567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets leading() function: 4569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set set:leading (node-set, node-set) 4570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1 and @nodes2 are sorted by document order, then 4571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * #exslSetsLeadingSorted is called. 4572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes1 that precede the first node in @nodes2 4574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in document order, @nodes1 if @nodes2 is NULL or empty or 4575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * an empty node-set if @nodes1 doesn't contain @nodes2 4576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 4578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathLeading (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { 4579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes2)) 4580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(nodes1); 4581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes1)) 4582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNodeSetCreate(NULL)); 4583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(nodes1); 4584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(nodes2); 4585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNodeLeadingSorted(nodes1, 4586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetItem(nodes2, 1))); 4587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeTrailingSorted: 4591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: a node-set, sorted by document order 4592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a node 4593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets trailing() function: 4595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set set:trailing (node-set, node-set) 4596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes that follow @node in document order, 4598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes if @node is NULL or an empty node-set if @nodes 4599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * doesn't contain @node 4600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 4602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeTrailingSorted (xmlNodeSetPtr nodes, xmlNodePtr node) { 4603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, l; 4604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur; 4605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ret; 4606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == NULL) 4608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(nodes); 4609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNodeSetCreate(NULL); 4611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes) || 4612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlXPathNodeSetContains(nodes, node))) 4613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l = xmlXPathNodeSetGetLength(nodes); 4616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = l - 1; i >= 0; i--) { 4617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlXPathNodeSetItem(nodes, i); 4618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == node) 4619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 4620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique(ret, cur); 4621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(ret); /* bug 413451 */ 4623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeTrailing: 4628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes: a node-set 4629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a node 4630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets trailing() function: 4632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set set:trailing (node-set, node-set) 4633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes is sorted by document order, then #xmlXPathNodeTrailingSorted 4634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is called. 4635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes that follow @node in document order, 4637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes if @node is NULL or an empty node-set if @nodes 4638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * doesn't contain @node 4639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 4641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeTrailing (xmlNodeSetPtr nodes, xmlNodePtr node) { 4642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(nodes); 4643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNodeTrailingSorted(nodes, node)); 4644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathTrailingSorted: 4648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1: a node-set, sorted by document order 4649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2: a node-set, sorted by document order 4650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets trailing() function: 4652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set set:trailing (node-set, node-set) 4653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes1 that follow the first node in @nodes2 4655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in document order, @nodes1 if @nodes2 is NULL or empty or 4656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * an empty node-set if @nodes1 doesn't contain @nodes2 4657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 4659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathTrailingSorted (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { 4660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes2)) 4661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(nodes1); 4662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNodeTrailingSorted(nodes1, 4663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetItem(nodes2, 0))); 4664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathTrailing: 4668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1: a node-set 4669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes2: a node-set 4670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the EXSLT - Sets trailing() function: 4672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set set:trailing (node-set, node-set) 4673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes1 and @nodes2 are sorted by document order, then 4674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * #xmlXPathTrailingSorted is called. 4675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the nodes in @nodes1 that follow the first node in @nodes2 4677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in document order, @nodes1 if @nodes2 is NULL or empty or 4678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * an empty node-set if @nodes1 doesn't contain @nodes2 4679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodeSetPtr 4681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathTrailing (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { 4682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes2)) 4683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(nodes1); 4684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeSetIsEmpty(nodes1)) 4685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNodeSetCreate(NULL)); 4686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(nodes1); 4687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(nodes2); 4688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNodeTrailingSorted(nodes1, 4689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetItem(nodes2, 0))); 4690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 4693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 4694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Routines to handle extra functions * 4695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 4696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 4697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterFunc: 4700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 4701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the function name 4702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f: the function implementation or NULL 4703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new function. If @f is NULL it unregisters the function 4705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error 4707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 4709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterFunc(xmlXPathContextPtr ctxt, const xmlChar *name, 4710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFunction f) { 4711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathRegisterFuncNS(ctxt, name, NULL, f)); 4712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterFuncNS: 4716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 4717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the function name 4718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns_uri: the function namespace URI 4719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f: the function implementation or NULL 4720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new function. If @f is NULL it unregisters the function 4722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error 4724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 4726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterFuncNS(xmlXPathContextPtr ctxt, const xmlChar *name, 4727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *ns_uri, xmlXPathFunction f) { 4728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 4729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) 4731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->funcHash == NULL) 4734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->funcHash = xmlHashCreate(0); 4735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->funcHash == NULL) 4736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (f == NULL) 4738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlHashRemoveEntry2(ctxt->funcHash, name, ns_uri, NULL)); 4739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlHashAddEntry2(ctxt->funcHash, name, ns_uri, XML_CAST_FPTR(f))); 4740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterFuncLookup: 4744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 4745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f: the lookup function 4746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @funcCtxt: the lookup data 4747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Registers an external mechanism to do function lookup. 4749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 4751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterFuncLookup (xmlXPathContextPtr ctxt, 4752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFuncLookupFunc f, 4753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *funcCtxt) { 4754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 4755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->funcLookupFunc = f; 4757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->funcLookupData = funcCtxt; 4758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFunctionLookup: 4762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 4763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the function name 4764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search in the Function array of the context for the given 4766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * function. 4767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathFunction or NULL if not found 4769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFunction 4771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFunctionLookup(xmlXPathContextPtr ctxt, const xmlChar *name) { 4772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 4773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 4774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->funcLookupFunc != NULL) { 4776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFunction ret; 4777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFuncLookupFunc f; 4778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project f = ctxt->funcLookupFunc; 4780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = f(ctxt->funcLookupData, name, NULL); 4781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != NULL) 4782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathFunctionLookupNS(ctxt, name, NULL)); 4785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFunctionLookupNS: 4789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 4790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the function name 4791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns_uri: the function namespace URI 4792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search in the Function array of the context for the given 4794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * function. 4795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathFunction or NULL if not found 4797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFunction 4799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFunctionLookupNS(xmlXPathContextPtr ctxt, const xmlChar *name, 4800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *ns_uri) { 4801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFunction ret; 4802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 4804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) 4806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->funcLookupFunc != NULL) { 4809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFuncLookupFunc f; 4810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project f = ctxt->funcLookupFunc; 4812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = f(ctxt->funcLookupData, name, ns_uri); 4813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != NULL) 4814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->funcHash == NULL) 4818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_CAST_FPTR(ret) = xmlHashLookup2(ctxt->funcHash, name, ns_uri); 4821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisteredFuncsCleanup: 4826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 4827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the XPath context data associated to registered functions 4829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 4831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisteredFuncsCleanup(xmlXPathContextPtr ctxt) { 4832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 4833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(ctxt->funcHash, NULL); 4836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->funcHash = NULL; 4837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 4840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 4841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Routines to handle Variables * 4842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 4843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 4844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterVariable: 4847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 4848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the variable name 4849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the variable value or NULL 4850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new variable value. If @value is NULL it unregisters 4852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the variable 4853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error 4855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 4857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterVariable(xmlXPathContextPtr ctxt, const xmlChar *name, 4858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr value) { 4859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathRegisterVariableNS(ctxt, name, NULL, value)); 4860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterVariableNS: 4864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 4865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the variable name 4866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns_uri: the variable namespace URI 4867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the variable value or NULL 4868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new variable value. If @value is NULL it unregisters 4870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the variable 4871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error 4873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 4875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterVariableNS(xmlXPathContextPtr ctxt, const xmlChar *name, 4876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *ns_uri, 4877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr value) { 4878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 4879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) 4881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->varHash == NULL) 4884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->varHash = xmlHashCreate(0); 4885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->varHash == NULL) 4886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 4887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (value == NULL) 4888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlHashRemoveEntry2(ctxt->varHash, name, ns_uri, 4889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlHashDeallocator)xmlXPathFreeObject)); 4890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlHashUpdateEntry2(ctxt->varHash, name, ns_uri, 4891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void *) value, 4892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlHashDeallocator)xmlXPathFreeObject)); 4893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterVariableLookup: 4897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 4898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f: the lookup function 4899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: the lookup data 4900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * register an external mechanism to do variable lookup 4902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 4904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterVariableLookup(xmlXPathContextPtr ctxt, 4905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathVariableLookupFunc f, void *data) { 4906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 4907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->varLookupFunc = f; 4909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->varLookupData = data; 4910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathVariableLookup: 4914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 4915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the variable name 4916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search in the Variable array of the context for the given 4918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * variable value. 4919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a copy of the value or NULL if not found 4921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 4923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathVariableLookup(xmlXPathContextPtr ctxt, const xmlChar *name) { 4924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 4925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->varLookupFunc != NULL) { 4928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 4929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ((xmlXPathVariableLookupFunc)ctxt->varLookupFunc) 4931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->varLookupData, name, NULL); 4932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 4933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathVariableLookupNS(ctxt, name, NULL)); 4935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathVariableLookupNS: 4939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 4940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the variable name 4941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns_uri: the variable namespace URI 4942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search in the Variable array of the context for the given 4944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * variable value. 4945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the a copy of the value or NULL if not found 4947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 4949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathVariableLookupNS(xmlXPathContextPtr ctxt, const xmlChar *name, 4950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *ns_uri) { 4951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 4952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->varLookupFunc != NULL) { 4955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 4956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ((xmlXPathVariableLookupFunc)ctxt->varLookupFunc) 4958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->varLookupData, name, ns_uri); 4959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != NULL) return(ret); 4960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 4961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->varHash == NULL) 4963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) 4965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 4966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCacheObjectCopy(ctxt, (xmlXPathObjectPtr) 4968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashLookup2(ctxt->varHash, name, ns_uri))); 4969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisteredVariablesCleanup: 4973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 4974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the XPath context data associated to registered variables 4976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 4978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisteredVariablesCleanup(xmlXPathContextPtr ctxt) { 4979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 4980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 4981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(ctxt->varHash, (xmlHashDeallocator)xmlXPathFreeObject); 4983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->varHash = NULL; 4984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 4985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 4987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterNs: 4988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 4989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prefix: the namespace prefix 4990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns_uri: the namespace name 4991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new namespace. If @ns_uri is NULL it unregisters 4993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the namespace 4994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error 4996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 4997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 4998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterNs(xmlXPathContextPtr ctxt, const xmlChar *prefix, 4999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *ns_uri) { 5000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 5001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix == NULL) 5003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nsHash == NULL) 5006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nsHash = xmlHashCreate(10); 5007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nsHash == NULL) 5008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 5009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns_uri == NULL) 5010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlHashRemoveEntry(ctxt->nsHash, prefix, 5011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlHashDeallocator)xmlFree)); 5012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlHashUpdateEntry(ctxt->nsHash, prefix, (void *) xmlStrdup(ns_uri), 5013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlHashDeallocator)xmlFree)); 5014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNsLookup: 5018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 5019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prefix: the namespace prefix value 5020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Search in the namespace declaration array of the context for the given 5022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * namespace name associated to the given prefix 5023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the value or NULL if not found 5025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectconst xmlChar * 5027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNsLookup(xmlXPathContextPtr ctxt, const xmlChar *prefix) { 5028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 5029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix == NULL) 5031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XML_XML_NAMESPACE 5034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(prefix, (const xmlChar *) "xml")) 5035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(XML_XML_NAMESPACE); 5036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->namespaces != NULL) { 5039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 5040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ctxt->nsNr;i++) { 5042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->namespaces[i] != NULL) && 5043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(ctxt->namespaces[i]->prefix, prefix))) 5044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->namespaces[i]->href); 5045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((const xmlChar *) xmlHashLookup(ctxt->nsHash, prefix)); 5049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisteredNsCleanup: 5053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 5054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the XPath context data associated to registered variables 5056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 5058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisteredNsCleanup(xmlXPathContextPtr ctxt) { 5059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 5060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(ctxt->nsHash, (xmlHashDeallocator)xmlFree); 5063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nsHash = NULL; 5064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 5067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 5068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Routines to handle Values * 5069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 5070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 5071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* Allocations are terrible, one needs to optimize all this !!! */ 5073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewFloat: 5076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the double value 5077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type double and of value @val 5079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 5081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 5083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewFloat(double val) { 5084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 5085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); 5087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 5088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating float object\n"); 5089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); 5092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_NUMBER; 5093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->floatval = val; 5094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 5095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(NULL, XPATH_NUMBER); 5096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewBoolean: 5102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the boolean value 5103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type boolean and of value @val 5105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 5107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 5109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewBoolean(int val) { 5110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 5111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); 5113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 5114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating boolean object\n"); 5115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); 5118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_BOOLEAN; 5119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->boolval = (val != 0); 5120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 5121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(NULL, XPATH_BOOLEAN); 5122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewString: 5128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the xmlChar * value 5129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type string and of value @val 5131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 5133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 5135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewString(const xmlChar *val) { 5136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 5137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); 5139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 5140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating string object\n"); 5141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); 5144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_STRING; 5145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val != NULL) 5146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = xmlStrdup(val); 5147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = xmlStrdup((const xmlChar *)""); 5149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 5150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(NULL, XPATH_STRING); 5151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathWrapString: 5157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the xmlChar * value 5158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wraps the @val string into an XPath object. 5160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 5162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 5164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathWrapString (xmlChar *val) { 5165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 5166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); 5168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 5169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating string object\n"); 5170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); 5173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_STRING; 5174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = val; 5175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 5176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(NULL, XPATH_STRING); 5177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewCString: 5183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the char * value 5184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathObjectPtr of type string and of value @val 5186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 5188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 5190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewCString(const char *val) { 5191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 5192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); 5194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 5195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating string object\n"); 5196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); 5199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_STRING; 5200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = xmlStrdup(BAD_CAST val); 5201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 5202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(NULL, XPATH_STRING); 5203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathWrapCString: 5209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the char * value 5210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wraps a string into an XPath object. 5212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 5214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 5216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathWrapCString (char * val) { 5217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathWrapString((xmlChar *)(val))); 5218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathWrapExternal: 5222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the user data 5223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Wraps the @val data into an XPath object. 5225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 5227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 5229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathWrapExternal (void *val) { 5230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 5231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); 5233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 5234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating user object\n"); 5235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); 5238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XPATH_USERS; 5239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->user = val; 5240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 5241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(NULL, XPATH_USERS); 5242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathObjectCopy: 5248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the original object 5249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * allocate a new copy of a given object 5251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object. 5253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 5255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectCopy(xmlXPathObjectPtr val) { 5256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 5257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 5259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); 5262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 5263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "copying object\n"); 5264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(ret, val , (size_t) sizeof(xmlXPathObject)); 5267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 5268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageRequested(NULL, val->type); 5269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (val->type) { 5271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 5272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 5273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 5274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 5275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 5277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->stringval = xmlStrdup(val->stringval); 5278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 5280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 5281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 5282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project Removed 11 July 2004 - the current handling of xslt tmpRVT nodes means that 5283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project this previous handling is no longer correct, and can cause some serious 5284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project problems (ref. bug 145547) 5285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/ 5286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((val->nodesetval != NULL) && 5287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (val->nodesetval->nodeTab != NULL)) { 5288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur, tmp; 5289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr top; 5290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->boolval = 1; 5292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project top = xmlNewDoc(NULL); 5293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project top->name = (char *) 5294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStrdup(val->nodesetval->nodeTab[0]->name); 5295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->user = top; 5296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (top != NULL) { 5297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project top->doc = top; 5298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = val->nodesetval->nodeTab[0]->children; 5299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 5300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlDocCopyNode(cur, top, 1); 5301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAddChild((xmlNodePtr) top, tmp); 5302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 5303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodesetval = xmlXPathNodeSetCreate((xmlNodePtr) top); 5307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 5308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodesetval = xmlXPathNodeSetCreate(NULL); 5309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Deallocate the copied tree value */ 5310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 5313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nodesetval = xmlXPathNodeSetMerge(NULL, val->nodesetval); 5314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Do not deallocate the copied tree value */ 5315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->boolval = 0; 5316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 5318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 5319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 5320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlLocationSetPtr loc = val->user; 5321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->user = (void *) xmlXPtrLocationSetMerge(NULL, loc); 5322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 5326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->user = val->user; 5327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 5329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 5330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathObjectCopy: unsupported type %d\n", 5331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val->type); 5332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeObject: 5339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj: the object to free 5340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up an xmlXPathObjectPtr object. 5342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 5344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeObject(xmlXPathObjectPtr obj) { 5345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj == NULL) return; 5346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((obj->type == XPATH_NODESET) || (obj->type == XPATH_XSLT_TREE)) { 5347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->boolval) { 5348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 5349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->user != NULL) { 5350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeNodeSet(obj->nodesetval); 5351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeNodeList((xmlNodePtr) obj->user); 5352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 5353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj->type = XPATH_XSLT_TREE; /* TODO: Just for debugging. */ 5355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodesetval != NULL) 5356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeValueTree(obj->nodesetval); 5357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodesetval != NULL) 5359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeNodeSet(obj->nodesetval); 5360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 5362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (obj->type == XPATH_LOCATIONSET) { 5363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->user != NULL) 5364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPtrFreeLocationSet(obj->user); 5365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (obj->type == XPATH_STRING) { 5367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->stringval != NULL) 5368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(obj->stringval); 5369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 5371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageReleased(NULL, obj->type); 5372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(obj); 5374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathReleaseObject: 5378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @obj: the xmlXPathObjectPtr to free or to cache 5379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Depending on the state of the cache this frees the given 5381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XPath object or stores it in the cache. 5382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 5384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathReleaseObject(xmlXPathContextPtr ctxt, xmlXPathObjectPtr obj) 5385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 5386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_CACHE_ADD(sl, o) if (sl == NULL) { \ 5387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sl = xmlPointerListCreate(10); if (sl == NULL) goto free_obj; } \ 5388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlPointerListAddSize(sl, obj, 0) == -1) goto free_obj; 5389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_CACHE_WANTS(sl, n) ((sl == NULL) || ((sl)->number < n)) 5391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj == NULL) 5393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->cache == NULL)) { 5395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(obj); 5396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextCachePtr cache = 5398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathContextCachePtr) ctxt->cache; 5399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (obj->type) { 5401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 5402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 5403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodesetval != NULL) { 5404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->boolval) { 5405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * It looks like the @boolval is used for 5407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * evaluation if this an XSLT Result Tree Fragment. 5408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: Check if this assumption is correct. 5409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj->type = XPATH_XSLT_TREE; /* just for debugging */ 5411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeValueTree(obj->nodesetval); 5412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj->nodesetval = NULL; 5413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((obj->nodesetval->nodeMax <= 40) && 5414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (XP_CACHE_WANTS(cache->nodesetObjs, 5415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cache->maxNodeset))) 5416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 5417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_CACHE_ADD(cache->nodesetObjs, obj); 5418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto obj_cached; 5419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeNodeSet(obj->nodesetval); 5421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj->nodesetval = NULL; 5422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 5426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->stringval != NULL) 5427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(obj->stringval); 5428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (XP_CACHE_WANTS(cache->stringObjs, cache->maxString)) { 5430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_CACHE_ADD(cache->stringObjs, obj); 5431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto obj_cached; 5432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 5435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (XP_CACHE_WANTS(cache->booleanObjs, cache->maxBoolean)) { 5436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_CACHE_ADD(cache->booleanObjs, obj); 5437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto obj_cached; 5438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 5441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (XP_CACHE_WANTS(cache->numberObjs, cache->maxNumber)) { 5442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_CACHE_ADD(cache->numberObjs, obj); 5443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto obj_cached; 5444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 5447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 5448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->user != NULL) { 5449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPtrFreeLocationSet(obj->user); 5450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto free_obj; 5452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 5454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto free_obj; 5455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Fallback to adding to the misc-objects slot. 5459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (XP_CACHE_WANTS(cache->miscObjs, cache->maxMisc)) { 5461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_CACHE_ADD(cache->miscObjs, obj); 5462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 5463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto free_obj; 5464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectobj_cached: 5466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 5468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageReleased(ctxt, obj->type); 5469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodesetval != NULL) { 5472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr tmpset = obj->nodesetval; 5473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: Due to those nasty ns-nodes, we need to traverse 5476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the list and free the ns-nodes. 5477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * URGENT TODO: Check if it's actually slowing things down. 5478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Maybe we shouldn't try to preserve the list. 5479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmpset->nodeNr > 1) { 5481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 5482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; 5483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < tmpset->nodeNr; i++) { 5485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = tmpset->nodeTab[i]; 5486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node != NULL) && 5487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_NAMESPACE_DECL)) 5488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 5489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetFreeNs((xmlNsPtr) node); 5490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (tmpset->nodeNr == 1) { 5493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tmpset->nodeTab[0] != NULL) && 5494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (tmpset->nodeTab[0]->type == XML_NAMESPACE_DECL)) 5495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetFreeNs((xmlNsPtr) tmpset->nodeTab[0]); 5496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmpset->nodeNr = 0; 5498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(obj, 0, sizeof(xmlXPathObject)); 5499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj->nodesetval = tmpset; 5500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 5501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(obj, 0, sizeof(xmlXPathObject)); 5502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfree_obj: 5506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 5507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cache is full; free the object. 5508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodesetval != NULL) 5510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeNodeSet(obj->nodesetval); 5511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEBUG_OBJ_USAGE 5512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugObjUsageReleased(NULL, obj->type); 5513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(obj); 5515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 5517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 5521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 5522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Type Casting Routines * 5523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 5524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 5525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastBooleanToString: 5528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: a boolean 5529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a boolean to its string value. 5531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a newly allocated string. 5533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar * 5535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastBooleanToString (int val) { 5536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret; 5537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val) 5538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrdup((const xmlChar *) "true"); 5539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 5540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrdup((const xmlChar *) "false"); 5541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNumberToString: 5546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: a number 5547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a number to its string value. 5549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a newly allocated string. 5551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar * 5553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNumberToString (double val) { 5554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret; 5555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (xmlXPathIsInf(val)) { 5556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 1: 5557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrdup((const xmlChar *) "Infinity"); 5558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case -1: 5560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrdup((const xmlChar *) "-Infinity"); 5561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 5563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsNaN(val)) { 5564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrdup((const xmlChar *) "NaN"); 5565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (val == 0 && xmlXPathGetSign(val) != 0) { 5566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrdup((const xmlChar *) "0"); 5567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 5568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* could be improved */ 5569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char buf[100]; 5570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFormatNumber(val, buf, 99); 5571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf[99] = 0; 5572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrdup((const xmlChar *) buf); 5573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNodeToString: 5580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a node 5581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a node to its string value. 5583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a newly allocated string. 5585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar * 5587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNodeToString (xmlNodePtr node) { 5588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *ret; 5589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret = xmlNodeGetContent(node)) == NULL) 5590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrdup((const xmlChar *) ""); 5591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNodeSetToString: 5596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: a node-set 5597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a node-set to its string value. 5599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a newly allocated string. 5601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar * 5603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNodeSetToString (xmlNodeSetPtr ns) { 5604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns == NULL) || (ns->nodeNr == 0) || (ns->nodeTab == NULL)) 5605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlStrdup((const xmlChar *) "")); 5606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns->nodeNr > 1) 5608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(ns); 5609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCastNodeToString(ns->nodeTab[0])); 5610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastToString: 5614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: an XPath object 5615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its string() equivalent 5617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the allocated string value of the object, NULL in case of error. 5619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * It's up to the caller to free the string memory with xmlFree(). 5620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar * 5622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastToString(xmlXPathObjectPtr val) { 5623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret = NULL; 5624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 5626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlStrdup((const xmlChar *) "")); 5627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (val->type) { 5628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 5629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 5630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "String: undefined\n"); 5631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrdup((const xmlChar *) ""); 5633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 5635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 5636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastNodeSetToString(val->nodesetval); 5637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 5639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlStrdup(val->stringval)); 5640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 5641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastBooleanToString(val->boolval); 5642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: { 5644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastNumberToString(val->floatval); 5645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 5648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 5649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 5650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 5651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO 5652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrdup((const xmlChar *) ""); 5653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathConvertString: 5660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: an XPath object 5661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its string() equivalent 5663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new object, the old one is freed (or the operation 5665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is done directly on @val) 5666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 5668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathConvertString(xmlXPathObjectPtr val) { 5669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *res = NULL; 5670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 5672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNewCString("")); 5673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (val->type) { 5675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 5676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 5677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "STRING: undefined\n"); 5678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 5681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 5682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathCastNodeSetToString(val->nodesetval); 5683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 5685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(val); 5686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 5687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathCastBooleanToString(val->boolval); 5688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 5690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathCastNumberToString(val->floatval); 5691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 5693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 5694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 5695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 5696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO; 5697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(val); 5700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res == NULL) 5701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNewCString("")); 5702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathWrapString(res)); 5703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastBooleanToNumber: 5707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: a boolean 5708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a boolean to its number value 5710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number value 5712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble 5714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastBooleanToNumber(int val) { 5715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val) 5716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1.0); 5717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0.0); 5718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastStringToNumber: 5722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: a string 5723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a string to its number value 5725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number value 5727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble 5729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastStringToNumber(const xmlChar * val) { 5730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathStringEvalNumber(val)); 5731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNodeToNumber: 5735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a node 5736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a node to its number value 5738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number value 5740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble 5742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNodeToNumber (xmlNodePtr node) { 5743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *strval; 5744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double ret; 5745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == NULL) 5747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNAN); 5748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project strval = xmlXPathCastNodeToString(node); 5749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (strval == NULL) 5750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNAN); 5751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastStringToNumber(strval); 5752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(strval); 5753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNodeSetToNumber: 5759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: a node-set 5760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a node-set to its number value 5762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number value 5764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble 5766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNodeSetToNumber (xmlNodeSetPtr ns) { 5767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *str; 5768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double ret; 5769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns == NULL) 5771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNAN); 5772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = xmlXPathCastNodeSetToString(ns); 5773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastStringToNumber(str); 5774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(str); 5775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastToNumber: 5780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: an XPath object 5781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an XPath object to its number value 5783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number value 5785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble 5787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastToNumber(xmlXPathObjectPtr val) { 5788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double ret = 0.0; 5789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 5791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNAN); 5792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (val->type) { 5793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 5794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEGUB_EXPR 5795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "NUMBER: undefined\n"); 5796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNAN; 5798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 5800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 5801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastNodeSetToNumber(val->nodesetval); 5802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 5804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastStringToNumber(val->stringval); 5805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 5807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = val->floatval; 5808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 5810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastBooleanToNumber(val->boolval); 5811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 5813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 5814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 5815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 5816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO; 5817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNAN; 5818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathConvertNumber: 5825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: an XPath object 5826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its number() equivalent 5828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new object, the old one is freed (or the operation 5830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is done directly on @val) 5831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 5833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathConvertNumber(xmlXPathObjectPtr val) { 5834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 5835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 5837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNewFloat(0.0)); 5838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val->type == XPATH_NUMBER) 5839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(val); 5840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNewFloat(xmlXPathCastToNumber(val)); 5841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(val); 5842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNumberToBoolean: 5847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: a number 5848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a number to its boolean value 5850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the boolean value 5852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 5854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNumberToBoolean (double val) { 5855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsNaN(val) || (val == 0.0)) 5856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 5858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastStringToBoolean: 5862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: a string 5863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a string to its boolean value 5865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the boolean value 5867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 5869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastStringToBoolean (const xmlChar *val) { 5870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((val == NULL) || (xmlStrlen(val) == 0)) 5871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 5873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastNodeSetToBoolean: 5877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: a node-set 5878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a node-set to its boolean value 5880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the boolean value 5882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 5884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastNodeSetToBoolean (xmlNodeSetPtr ns) { 5885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns == NULL) || (ns->nodeNr == 0)) 5886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 5888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCastToBoolean: 5892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: an XPath object 5893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an XPath object to its boolean value 5895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the boolean value 5897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 5899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCastToBoolean (xmlXPathObjectPtr val) { 5900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 5901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 5903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 5904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (val->type) { 5905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 5906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 5907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "BOOLEAN: undefined\n"); 5908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 5909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 5910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 5912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 5913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastNodeSetToBoolean(val->nodesetval); 5914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 5916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastStringToBoolean(val->stringval); 5917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 5919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCastNumberToBoolean(val->floatval); 5920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 5922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = val->boolval; 5923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 5925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 5926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 5927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 5928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO; 5929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 5930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 5931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathConvertBoolean: 5938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: an XPath object 5939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts an existing object to its boolean() equivalent 5941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new object, the old one is freed (or the operation 5943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is done directly on @val) 5944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 5946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathConvertBoolean(xmlXPathObjectPtr val) { 5947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 5948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) 5950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNewBoolean(0)); 5951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val->type == XPATH_BOOLEAN) 5952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(val); 5953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNewBoolean(xmlXPathCastToBoolean(val)); 5954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(val); 5955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 5956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 5957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 5959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 5960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Routines to handle XPath contexts * 5961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 5962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 5963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 5965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewContext: 5966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the XML document 5967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathContext 5969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 5970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathContext just allocated. The caller will need to free it. 5971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 5972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathContextPtr 5973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewContext(xmlDocPtr doc) { 5974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextPtr ret; 5975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathContextPtr) xmlMalloc(sizeof(xmlXPathContext)); 5977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 5978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "creating context\n"); 5979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 5980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 5981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathContext)); 5982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->doc = doc; 5983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->node = NULL; 5984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->varHash = NULL; 5986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nb_types = 0; 5988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->max_types = 0; 5989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->types = NULL; 5990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->funcHash = xmlHashCreate(0); 5992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nb_axis = 0; 5994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->max_axis = 0; 5995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->axis = NULL; 5996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 5997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nsHash = NULL; 5998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->user = NULL; 5999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->contextSize = -1; 6001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->proximityPosition = -1; 6002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_DEFAULT_CACHE_ON 6004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathContextSetCache(ret, 1, -1, 0) == -1) { 6005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeContext(ret); 6006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 6009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterAllFunctions(ret); 6011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeContext: 6017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the context to free 6018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up an xmlXPathContext 6020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 6022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeContext(xmlXPathContextPtr ctxt) { 6023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return; 6024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->cache != NULL) 6026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeCache((xmlXPathContextCachePtr) ctxt->cache); 6027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisteredNsCleanup(ctxt); 6028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisteredFuncsCleanup(ctxt); 6029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisteredVariablesCleanup(ctxt); 6030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlResetError(&ctxt->lastError); 6031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt); 6032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 6035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Routines to handle XPath parser contexts * 6037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 6039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CHECK_CTXT(ctxt) \ 6041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) { \ 6042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, \ 6043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, XML_FROM_XPATH, \ 6044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_INTERNAL_ERROR, XML_ERR_FATAL, \ 6045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __FILE__, __LINE__, \ 6046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, NULL, 0, 0, \ 6047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "NULL context pointer\n"); \ 6048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); \ 6049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } \ 6050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CHECK_CTXT_NEG(ctxt) \ 6052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) { \ 6053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, \ 6054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, XML_FROM_XPATH, \ 6055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_INTERNAL_ERROR, XML_ERR_FATAL, \ 6056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __FILE__, __LINE__, \ 6057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, NULL, 0, 0, \ 6058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "NULL context pointer\n"); \ 6059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); \ 6060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } \ 6061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CHECK_CONTEXT(ctxt) \ 6064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->doc == NULL) || \ 6065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->doc->children == NULL)) { \ 6066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_INVALID_CTXT); \ 6067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); \ 6068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNewParserContext: 6073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: the XPath expression 6074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 6075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathParserContext 6077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathParserContext just allocated. 6079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathParserContextPtr 6081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNewParserContext(const xmlChar *str, xmlXPathContextPtr ctxt) { 6082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathParserContextPtr ret; 6083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathParserContextPtr) xmlMalloc(sizeof(xmlXPathParserContext)); 6085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 6086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(ctxt, "creating parser context\n"); 6087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathParserContext)); 6090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->cur = ret->base = str; 6091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->context = ctxt; 6092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->comp = xmlXPathNewCompExpr(); 6094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->comp == NULL) { 6095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret->valueTab); 6096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 6097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (ctxt->dict != NULL)) { 6100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->comp->dict = ctxt->dict; 6101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictReference(ret->comp->dict); 6102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompParserContext: 6109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the XPath compiled expression 6110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 6111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlXPathParserContext when processing a compiled expression 6113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathParserContext just allocated. 6115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathParserContextPtr 6117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompParserContext(xmlXPathCompExprPtr comp, xmlXPathContextPtr ctxt) { 6118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathParserContextPtr ret; 6119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlXPathParserContextPtr) xmlMalloc(sizeof(xmlXPathParserContext)); 6121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 6122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(ctxt, "creating evaluation context\n"); 6123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0 , (size_t) sizeof(xmlXPathParserContext)); 6126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Allocate the value stack */ 6128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->valueTab = (xmlXPathObjectPtr *) 6129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(10 * sizeof(xmlXPathObjectPtr)); 6130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->valueTab == NULL) { 6131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 6132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(ctxt, "creating evaluation context\n"); 6133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 6134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->valueNr = 0; 6136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->valueMax = 10; 6137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->value = NULL; 6138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->context = ctxt; 6140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->comp = comp; 6141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFreeParserContext: 6147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the context to free 6148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up an xmlXPathParserContext 6150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 6152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFreeParserContext(xmlXPathParserContextPtr ctxt) { 6153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->valueTab != NULL) { 6154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->valueTab); 6155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->comp != NULL) { 6157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING 6158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->comp->stream != NULL) { 6159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreePatternList(ctxt->comp->stream); 6160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->comp->stream = NULL; 6161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 6163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeCompExpr(ctxt->comp); 6164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt); 6166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 6169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The implicit core function library * 6171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 6172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 6173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeValHash: 6176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a node pointer 6177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function computing the beginning of the string value of the node, 6179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * used to speed up comparisons 6180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns an int usable as a hash 6182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic unsigned int 6184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeValHash(xmlNodePtr node) { 6185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len = 2; 6186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * string = NULL; 6187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr tmp = NULL; 6188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int ret = 0; 6189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == NULL) 6191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->type == XML_DOCUMENT_NODE) { 6194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlDocGetRootElement((xmlDocPtr) node); 6195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) 6196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = node->children; 6197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = tmp; 6199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == NULL) 6201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (node->type) { 6205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 6206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 6207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 6208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 6209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project string = node->content; 6210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (string == NULL) 6211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (string[0] == 0) 6213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(((unsigned int) string[0]) + 6215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (((unsigned int) string[1]) << 8)); 6216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: 6217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project string = ((xmlNsPtr)node)->href; 6218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (string == NULL) 6219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (string[0] == 0) 6221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(((unsigned int) string[0]) + 6223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (((unsigned int) string[1]) << 8)); 6224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: 6225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = ((xmlAttrPtr) node)->children; 6226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 6228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = node->children; 6229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 6231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tmp != NULL) { 6234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (tmp->type) { 6235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 6236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 6237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 6238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 6239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project string = tmp->content; 6240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: 6242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project string = ((xmlNsPtr)tmp)->href; 6243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 6245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((string != NULL) && (string[0] != 0)) { 6248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (len == 1) { 6249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret + (((unsigned int) string[0]) << 8)); 6250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (string[1] == 0) { 6252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = 1; 6253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (unsigned int) string[0]; 6254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(((unsigned int) string[0]) + 6256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (((unsigned int) string[1]) << 8)); 6257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip to next node 6261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tmp->children != NULL) && (tmp->type != XML_DTD_NODE)) { 6263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp->children->type != XML_ENTITY_DECL) { 6264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->children; 6265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 6266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == node) 6269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp->next != NULL) { 6272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->next; 6273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 6274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 6277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->parent; 6278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) 6279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == node) { 6281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = NULL; 6282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp->next != NULL) { 6285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->next; 6286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (tmp != NULL); 6289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathStringHash: 6295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @string: a string 6296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function computing the beginning of the string value of the node, 6298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * used to speed up comparisons 6299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns an int usable as a hash 6301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic unsigned int 6303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathStringHash(const xmlChar * string) { 6304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (string == NULL) 6305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((unsigned int) 0); 6306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (string[0] == 0) 6307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(((unsigned int) string[0]) + 6309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (((unsigned int) string[1]) << 8)); 6310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompareNodeSetFloat: 6314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 6315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inf: less than (1) or greater than (0) 6316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strict: is the comparison strict 6317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg: the node set 6318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f: the value 6319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the compare operation between a nodeset and a number 6321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns < @val (1, 1, ... 6322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns <= @val (1, 0, ... 6323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns > @val (0, 1, ... 6324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns >= @val (0, 0, ... 6325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If one object to be compared is a node-set and the other is a number, 6327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the comparison will be true if and only if there is a node in the 6328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set such that the result of performing the comparison on the number 6329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to be compared and on the result of converting the string-value of that 6330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node to a number using the number function is true. 6331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test. 6333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 6335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompareNodeSetFloat(xmlXPathParserContextPtr ctxt, int inf, int strict, 6336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg, xmlXPathObjectPtr f) { 6337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, ret = 0; 6338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ns; 6339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *str2; 6340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((f == NULL) || (arg == NULL) || 6342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) { 6343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg); 6344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, f); 6345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = arg->nodesetval; 6348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) { 6349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ns->nodeNr;i++) { 6350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str2 = xmlXPathCastNodeToString(ns->nodeTab[i]); 6351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str2 != NULL) { 6352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 6353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheNewString(ctxt->context, str2)); 6354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(str2); 6355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNumberFunction(ctxt, 1); 6356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheObjectCopy(ctxt->context, f)); 6357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCompareValues(ctxt, inf, strict); 6358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret) 6359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg); 6364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, f); 6365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompareNodeSetString: 6370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 6371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inf: less than (1) or greater than (0) 6372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strict: is the comparison strict 6373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg: the node set 6374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @s: the value 6375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the compare operation between a nodeset and a string 6377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns < @val (1, 1, ... 6378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns <= @val (1, 0, ... 6379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns > @val (0, 1, ... 6380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns >= @val (0, 0, ... 6381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If one object to be compared is a node-set and the other is a string, 6383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the comparison will be true if and only if there is a node in 6384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the node-set such that the result of performing the comparison on the 6385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string-value of the node and the other string is true. 6386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test. 6388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 6390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompareNodeSetString(xmlXPathParserContextPtr ctxt, int inf, int strict, 6391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg, xmlXPathObjectPtr s) { 6392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, ret = 0; 6393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ns; 6394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *str2; 6395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((s == NULL) || (arg == NULL) || 6397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) { 6398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg); 6399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, s); 6400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = arg->nodesetval; 6403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) { 6404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ns->nodeNr;i++) { 6405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str2 = xmlXPathCastNodeToString(ns->nodeTab[i]); 6406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str2 != NULL) { 6407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 6408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheNewString(ctxt->context, str2)); 6409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(str2); 6410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheObjectCopy(ctxt->context, s)); 6411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCompareValues(ctxt, inf, strict); 6412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret) 6413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg); 6418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, s); 6419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompareNodeSets: 6424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inf: less than (1) or greater than (0) 6425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strict: is the comparison strict 6426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1: the first node set object 6427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg2: the second node set object 6428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the compare operation on nodesets: 6430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If both objects to be compared are node-sets, then the comparison 6432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will be true if and only if there is a node in the first node-set 6433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and a node in the second node-set such that the result of performing 6434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the comparison on the string-values of the two nodes is true. 6435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * .... 6436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * When neither object to be compared is a node-set and the operator 6437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is <=, <, >= or >, then the objects are compared by converting both 6438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * objects to numbers and comparing the numbers according to IEEE 754. 6439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * .... 6440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The number function converts its argument to a number as follows: 6441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - a string that consists of optional whitespace followed by an 6442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * optional minus sign followed by a Number followed by whitespace 6443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is converted to the IEEE 754 number that is nearest (according 6444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to the IEEE 754 round-to-nearest rule) to the mathematical value 6445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * represented by the string; any other string is converted to NaN 6446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Conclusion all nodes need to be converted first to their string value 6448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and then the comparison must be done when possible 6449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 6451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompareNodeSets(int inf, int strict, 6452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg1, xmlXPathObjectPtr arg2) { 6453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j, init = 0; 6454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double val1; 6455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double *values2; 6456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 6457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ns1; 6458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ns2; 6459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1 == NULL) || 6461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE))) { 6462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg2); 6463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg2 == NULL) || 6466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((arg2->type != XPATH_NODESET) && (arg2->type != XPATH_XSLT_TREE))) { 6467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg1); 6468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg2); 6469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns1 = arg1->nodesetval; 6473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns2 = arg2->nodesetval; 6474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns1 == NULL) || (ns1->nodeNr <= 0)) { 6476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg1); 6477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg2); 6478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns2 == NULL) || (ns2->nodeNr <= 0)) { 6481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg1); 6482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg2); 6483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values2 = (double *) xmlMalloc(ns2->nodeNr * sizeof(double)); 6487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (values2 == NULL) { 6488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "comparing nodesets\n"); 6489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg1); 6490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg2); 6491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ns1->nodeNr;i++) { 6494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val1 = xmlXPathCastNodeToNumber(ns1->nodeTab[i]); 6495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsNaN(val1)) 6496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 6497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0;j < ns2->nodeNr;j++) { 6498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (init == 0) { 6499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values2[j] = xmlXPathCastNodeToNumber(ns2->nodeTab[j]); 6500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsNaN(values2[j])) 6502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 6503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (inf && strict) 6504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (val1 < values2[j]); 6505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (inf && !strict) 6506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (val1 <= values2[j]); 6507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (!inf && strict) 6508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (val1 > values2[j]); 6509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (!inf && !strict) 6510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (val1 >= values2[j]); 6511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret) 6512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret) 6515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project init = 1; 6517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(values2); 6519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg1); 6520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg2); 6521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompareNodeSetValue: 6526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 6527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inf: less than (1) or greater than (0) 6528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strict: is the comparison strict 6529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg: the node set 6530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the value 6531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the compare operation between a nodeset and a value 6533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns < @val (1, 1, ... 6534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns <= @val (1, 0, ... 6535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns > @val (0, 1, ... 6536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns >= @val (0, 0, ... 6537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If one object to be compared is a node-set and the other is a boolean, 6539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the comparison will be true if and only if the result of performing 6540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the comparison on the boolean and on the result of converting 6541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the node-set to a boolean using the boolean function is true. 6542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test. 6544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 6546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompareNodeSetValue(xmlXPathParserContextPtr ctxt, int inf, int strict, 6547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg, xmlXPathObjectPtr val) { 6548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((val == NULL) || (arg == NULL) || 6549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) 6550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch(val->type) { 6553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 6554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCompareNodeSetFloat(ctxt, inf, strict, arg, val)); 6555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 6556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 6557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCompareNodeSets(inf, strict, arg, val)); 6558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 6559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCompareNodeSetString(ctxt, inf, strict, arg, val)); 6560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 6561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, arg); 6562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathBooleanFunction(ctxt, 1); 6563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, val); 6564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCompareValues(ctxt, inf, strict)); 6565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 6566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO 6567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEqualNodeSetString: 6573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg: the nodeset object argument 6574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: the string to compare to. 6575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @neq: flag to show whether for '=' (0) or '!=' (1) 6576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the equal operation on XPath objects content: @arg1 == @arg2 6578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If one object to be compared is a node-set and the other is a string, 6579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the comparison will be true if and only if there is a node in 6580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the node-set such that the result of performing the comparison on the 6581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string-value of the node and the other string is true. 6582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test. 6584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 6586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEqualNodeSetString(xmlXPathObjectPtr arg, const xmlChar * str, int neq) 6587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 6588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 6589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ns; 6590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *str2; 6591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int hash; 6592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((str == NULL) || (arg == NULL) || 6594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) 6595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 6596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = arg->nodesetval; 6597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A NULL nodeset compared with a string is always false 6599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (since there is no node equal, and no node not equal) 6600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns == NULL) || (ns->nodeNr <= 0) ) 6602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 6603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hash = xmlXPathStringHash(str); 6604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < ns->nodeNr; i++) { 6605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNodeValHash(ns->nodeTab[i]) == hash) { 6606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str2 = xmlNodeGetContent(ns->nodeTab[i]); 6607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((str2 != NULL) && (xmlStrEqual(str, str2))) { 6608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(str2); 6609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (neq) 6610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 6611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 6612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((str2 == NULL) && (xmlStrEqual(str, BAD_CAST ""))) { 6613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (neq) 6614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 6615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 6616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (neq) { 6617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str2 != NULL) 6618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(str2); 6619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 6620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str2 != NULL) 6622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(str2); 6623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (neq) 6624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (1); 6625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 6627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEqualNodeSetFloat: 6631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg: the nodeset object argument 6632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f: the float to compare to 6633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @neq: flag to show whether to compare '=' (0) or '!=' (1) 6634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the equal operation on XPath objects content: @arg1 == @arg2 6636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If one object to be compared is a node-set and the other is a number, 6637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the comparison will be true if and only if there is a node in 6638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the node-set such that the result of performing the comparison on the 6639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number to be compared and on the result of converting the string-value 6640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of that node to a number using the number function is true. 6641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test. 6643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 6645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEqualNodeSetFloat(xmlXPathParserContextPtr ctxt, 6646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg, double f, int neq) { 6647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, ret=0; 6648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ns; 6649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *str2; 6650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr val; 6651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double v; 6652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg == NULL) || 6654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) 6655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = arg->nodesetval; 6658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns != NULL) { 6659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i=0;i<ns->nodeNr;i++) { 6660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str2 = xmlXPathCastNodeToString(ns->nodeTab[i]); 6661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str2 != NULL) { 6662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, str2)); 6663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(str2); 6664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNumberFunction(ctxt, 1); 6665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = valuePop(ctxt); 6666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project v = val->floatval; 6667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, val); 6668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlXPathIsNaN(v)) { 6669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!neq) && (v==f)) { 6670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 6671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((neq) && (v!=f)) { 6673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 6674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { /* NaN is unequal to any value */ 6677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (neq) 6678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 6679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEqualNodeSets: 6690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1: first nodeset object argument 6691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg2: second nodeset object argument 6692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @neq: flag to show whether to test '=' (0) or '!=' (1) 6693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the equal / not equal operation on XPath nodesets: 6695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1 == @arg2 or @arg1 != @arg2 6696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If both objects to be compared are node-sets, then the comparison 6697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will be true if and only if there is a node in the first node-set and 6698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a node in the second node-set such that the result of performing the 6699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * comparison on the string-values of the two nodes is true. 6700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (needless to say, this is a costly operation) 6702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test. 6704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 6706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEqualNodeSets(xmlXPathObjectPtr arg1, xmlXPathObjectPtr arg2, int neq) { 6707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j; 6708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int *hashs1; 6709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int *hashs2; 6710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar **values1; 6711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar **values2; 6712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 6713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ns1; 6714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ns2; 6715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1 == NULL) || 6717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE))) 6718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg2 == NULL) || 6720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((arg2->type != XPATH_NODESET) && (arg2->type != XPATH_XSLT_TREE))) 6721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns1 = arg1->nodesetval; 6724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns2 = arg2->nodesetval; 6725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns1 == NULL) || (ns1->nodeNr <= 0)) 6727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns2 == NULL) || (ns2->nodeNr <= 0)) 6729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for equal, check if there is a node pertaining to both sets 6733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (neq == 0) 6735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ns1->nodeNr;i++) 6736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0;j < ns2->nodeNr;j++) 6737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ns1->nodeTab[i] == ns2->nodeTab[j]) 6738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 6739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values1 = (xmlChar **) xmlMalloc(ns1->nodeNr * sizeof(xmlChar *)); 6741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (values1 == NULL) { 6742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "comparing nodesets\n"); 6743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hashs1 = (unsigned int *) xmlMalloc(ns1->nodeNr * sizeof(unsigned int)); 6746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (hashs1 == NULL) { 6747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "comparing nodesets\n"); 6748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(values1); 6749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(values1, 0, ns1->nodeNr * sizeof(xmlChar *)); 6752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values2 = (xmlChar **) xmlMalloc(ns2->nodeNr * sizeof(xmlChar *)); 6753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (values2 == NULL) { 6754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "comparing nodesets\n"); 6755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(hashs1); 6756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(values1); 6757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hashs2 = (unsigned int *) xmlMalloc(ns2->nodeNr * sizeof(unsigned int)); 6760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (hashs2 == NULL) { 6761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(NULL, "comparing nodesets\n"); 6762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(hashs1); 6763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(values1); 6764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(values2); 6765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 6766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(values2, 0, ns2->nodeNr * sizeof(xmlChar *)); 6768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ns1->nodeNr;i++) { 6769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hashs1[i] = xmlXPathNodeValHash(ns1->nodeTab[i]); 6770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0;j < ns2->nodeNr;j++) { 6771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (i == 0) 6772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hashs2[j] = xmlXPathNodeValHash(ns2->nodeTab[j]); 6773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (hashs1[i] != hashs2[j]) { 6774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (neq) { 6775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 6776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 6780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (values1[i] == NULL) 6781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values1[i] = xmlNodeGetContent(ns1->nodeTab[i]); 6782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (values2[j] == NULL) 6783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project values2[j] = xmlNodeGetContent(ns2->nodeTab[j]); 6784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrEqual(values1[i], values2[j]) ^ neq; 6785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret) 6786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret) 6790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ns1->nodeNr;i++) 6793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (values1[i] != NULL) 6794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(values1[i]); 6795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j = 0;j < ns2->nodeNr;j++) 6796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (values2[j] != NULL) 6797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(values2[j]); 6798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(values1); 6799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(values2); 6800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(hashs1); 6801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(hashs2); 6802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 6806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEqualValuesCommon(xmlXPathParserContextPtr ctxt, 6807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg1, xmlXPathObjectPtr arg2) { 6808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 6809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 6810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *At this point we are assured neither arg1 nor arg2 6811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *is a nodeset, so we can just pick the appropriate routine. 6812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (arg1->type) { 6814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 6815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 6816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 6817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Equal: undefined\n"); 6818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 6819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 6821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (arg2->type) { 6822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 6823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 6824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 6825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Equal: undefined\n"); 6826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 6827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 6829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 6830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 6831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Equal: %d boolean %d \n", 6832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1->boolval, arg2->boolval); 6833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 6834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (arg1->boolval == arg2->boolval); 6835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 6837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (arg1->boolval == 6838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCastNumberToBoolean(arg2->floatval)); 6839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 6841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg2->stringval == NULL) || 6842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (arg2->stringval[0] == 0)) ret = 0; 6843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 6845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (arg1->boolval == ret); 6846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 6848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 6849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 6850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 6851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO 6852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 6854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 6855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 6859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (arg2->type) { 6860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 6861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 6862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 6863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Equal: undefined\n"); 6864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 6865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 6867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (arg2->boolval== 6868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCastNumberToBoolean(arg1->floatval)); 6869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 6871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, arg2); 6872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNumberFunction(ctxt, 1); 6873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2 = valuePop(ctxt); 6874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* no break on purpose */ 6875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 6876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Hand check NaN and Infinity equalities */ 6877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsNaN(arg1->floatval) || 6878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathIsNaN(arg2->floatval)) { 6879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 6880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlXPathIsInf(arg1->floatval) == 1) { 6881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsInf(arg2->floatval) == 1) 6882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 6883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 6885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlXPathIsInf(arg1->floatval) == -1) { 6886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsInf(arg2->floatval) == -1) 6887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 6888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 6890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlXPathIsInf(arg2->floatval) == 1) { 6891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsInf(arg1->floatval) == 1) 6892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 6893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 6895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlXPathIsInf(arg2->floatval) == -1) { 6896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsInf(arg1->floatval) == -1) 6897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 6898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 6900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (arg1->floatval == arg2->floatval); 6902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 6905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 6906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 6907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 6908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO 6909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 6911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 6912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 6916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (arg2->type) { 6917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 6918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 6919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 6920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Equal: undefined\n"); 6921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 6922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 6924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1->stringval == NULL) || 6925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (arg1->stringval[0] == 0)) ret = 0; 6926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 6928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (arg2->boolval == ret); 6929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 6931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrEqual(arg1->stringval, arg2->stringval); 6932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 6934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, arg1); 6935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNumberFunction(ctxt, 1); 6936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = valuePop(ctxt); 6937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Hand check NaN and Infinity equalities */ 6938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsNaN(arg1->floatval) || 6939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathIsNaN(arg2->floatval)) { 6940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 6941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlXPathIsInf(arg1->floatval) == 1) { 6942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsInf(arg2->floatval) == 1) 6943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 6944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 6946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlXPathIsInf(arg1->floatval) == -1) { 6947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsInf(arg2->floatval) == -1) 6948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 6949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 6951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlXPathIsInf(arg2->floatval) == 1) { 6952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsInf(arg1->floatval) == 1) 6953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 6954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 6956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlXPathIsInf(arg2->floatval) == -1) { 6957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsInf(arg1->floatval) == -1) 6958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 6959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 6960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 6961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 6962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (arg1->floatval == arg2->floatval); 6963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 6966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 6967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 6968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 6969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO 6970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 6972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 6973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 6977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 6978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 6979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 6980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO 6981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 6983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 6984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 6985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 6986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg1); 6987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 6988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 6989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 6990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 6991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 6992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEqualValues: 6993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 6994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the equal operation on XPath objects content: @arg1 == @arg2 6996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test. 6998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 7000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEqualValues(xmlXPathParserContextPtr ctxt) { 7001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg1, arg2, argtmp; 7002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 7003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(0); 7005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2 = valuePop(ctxt); 7006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = valuePop(ctxt); 7007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1 == NULL) || (arg2 == NULL)) { 7008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg1 != NULL) 7009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg1); 7010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 7012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR0(XPATH_INVALID_OPERAND); 7013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg1 == arg2) { 7016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 7017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 7018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Equal: by pointer\n"); 7019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg1); 7021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 7022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *If either argument is a nodeset, it's a 'special case' 7026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE) || 7028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) { 7029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *Hack it to assure arg1 is the nodeset 7031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE)) { 7033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project argtmp = arg2; 7034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2 = arg1; 7035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = argtmp; 7036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (arg2->type) { 7038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 7039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 7040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 7041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Equal: undefined\n"); 7042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 7045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 7046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathEqualNodeSets(arg1, arg2, 0); 7047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 7049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1->nodesetval == NULL) || 7050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (arg1->nodesetval->nodeNr == 0)) ret = 0; 7051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 7053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (ret == arg2->boolval); 7054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 7056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathEqualNodeSetFloat(ctxt, arg1, arg2->floatval, 0); 7057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 7059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathEqualNodeSetString(arg1, arg2->stringval, 0); 7060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 7062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 7063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 7064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 7065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO 7066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg1); 7069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 7070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlXPathEqualValuesCommon(ctxt, arg1, arg2)); 7074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNotEqualValues: 7078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the equal operation on XPath objects content: @arg1 == @arg2 7081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1 depending on the results of the test. 7083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 7085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNotEqualValues(xmlXPathParserContextPtr ctxt) { 7086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg1, arg2, argtmp; 7087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 7088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(0); 7090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2 = valuePop(ctxt); 7091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = valuePop(ctxt); 7092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1 == NULL) || (arg2 == NULL)) { 7093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg1 != NULL) 7094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg1); 7095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 7097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR0(XPATH_INVALID_OPERAND); 7098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg1 == arg2) { 7101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 7102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 7103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "NotEqual: by pointer\n"); 7104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg1); 7106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 7107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *If either argument is a nodeset, it's a 'special case' 7111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE) || 7113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) { 7114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *Hack it to assure arg1 is the nodeset 7116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE)) { 7118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project argtmp = arg2; 7119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2 = arg1; 7120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = argtmp; 7121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (arg2->type) { 7123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 7124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 7125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 7126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "NotEqual: undefined\n"); 7127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 7130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 7131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathEqualNodeSets(arg1, arg2, 1); 7132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 7134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1->nodesetval == NULL) || 7135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (arg1->nodesetval->nodeNr == 0)) ret = 0; 7136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 7138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (ret != arg2->boolval); 7139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 7141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathEqualNodeSetFloat(ctxt, arg1, arg2->floatval, 1); 7142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 7144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathEqualNodeSetString(arg1, arg2->stringval,1); 7145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 7147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 7148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 7149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 7150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO 7151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg1); 7154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 7155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (!xmlXPathEqualValuesCommon(ctxt, arg1, arg2)); 7159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompareValues: 7163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @inf: less than (1) or greater than (0) 7165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strict: is the comparison strict 7166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the compare operation on XPath objects: 7168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1 < @arg2 (1, 1, ... 7169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1 <= @arg2 (1, 0, ... 7170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1 > @arg2 (0, 1, ... 7171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1 >= @arg2 (0, 0, ... 7172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * When neither object to be compared is a node-set and the operator is 7174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * <=, <, >=, >, then the objects are compared by converted both objects 7175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to numbers and comparing the numbers according to IEEE 754. The < 7176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * comparison will be true if and only if the first number is less than the 7177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * second number. The <= comparison will be true if and only if the first 7178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number is less than or equal to the second number. The > comparison 7179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will be true if and only if the first number is greater than the second 7180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number. The >= comparison will be true if and only if the first number 7181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is greater than or equal to the second number. 7182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the comparison succeeded, 0 if it failed 7184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 7186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompareValues(xmlXPathParserContextPtr ctxt, int inf, int strict) { 7187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, arg1i = 0, arg2i = 0; 7188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg1, arg2; 7189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(0); 7191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2 = valuePop(ctxt); 7192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = valuePop(ctxt); 7193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1 == NULL) || (arg2 == NULL)) { 7194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg1 != NULL) 7195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg1); 7196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 7198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR0(XPATH_INVALID_OPERAND); 7199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE) || 7202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) { 7203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If either argument is a XPATH_NODESET or XPATH_XSLT_TREE the two arguments 7205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * are not freed from within this routine; they will be freed from the 7206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * called routine, e.g. xmlXPathCompareNodeSets or xmlXPathCompareNodeSetValue 7207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE)) && 7209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE))){ 7210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCompareNodeSets(inf, strict, arg1, arg2); 7211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) { 7213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCompareNodeSetValue(ctxt, inf, strict, 7214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1, arg2); 7215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCompareNodeSetValue(ctxt, !inf, strict, 7217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2, arg1); 7218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg1->type != XPATH_NUMBER) { 7224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, arg1); 7225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNumberFunction(ctxt, 1); 7226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = valuePop(ctxt); 7227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg1->type != XPATH_NUMBER) { 7229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg1); 7230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg2); 7231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR0(XPATH_INVALID_OPERAND); 7232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg2->type != XPATH_NUMBER) { 7234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, arg2); 7235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNumberFunction(ctxt, 1); 7236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2 = valuePop(ctxt); 7237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg2->type != XPATH_NUMBER) { 7239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg1); 7240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 7241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR0(XPATH_INVALID_OPERAND); 7242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add tests for infinity and nan 7245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * => feedback on 3.4 for Inf and NaN 7246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Hand check NaN and Infinity comparisons */ 7248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsNaN(arg1->floatval) || xmlXPathIsNaN(arg2->floatval)) { 7249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret=0; 7250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1i=xmlXPathIsInf(arg1->floatval); 7252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2i=xmlXPathIsInf(arg2->floatval); 7253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (inf && strict) { 7254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1i == -1 && arg2i != -1) || 7255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (arg2i == 1 && arg1i != 1)) { 7256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 7257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (arg1i == 0 && arg2i == 0) { 7258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (arg1->floatval < arg2->floatval); 7259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 7261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (inf && !strict) { 7264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg1i == -1 || arg2i == 1) { 7265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 7266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (arg1i == 0 && arg2i == 0) { 7267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (arg1->floatval <= arg2->floatval); 7268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 7270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (!inf && strict) { 7273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1i == 1 && arg2i != 1) || 7274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (arg2i == -1 && arg1i != -1)) { 7275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 7276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (arg1i == 0 && arg2i == 0) { 7277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (arg1->floatval > arg2->floatval); 7278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 7280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (!inf && !strict) { 7283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg1i == 1 || arg2i == -1) { 7284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 7285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (arg1i == 0 && arg2i == 0) { 7286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (arg1->floatval >= arg2->floatval); 7287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 7289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg1); 7293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 7294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 7295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathValueFlipSign: 7299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the unary - operation on an XPath object 7302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The numeric operators convert their operands to numbers as if 7303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by calling the number function. 7304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 7306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathValueFlipSign(xmlXPathParserContextPtr ctxt) { 7307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return; 7308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_NUMBER; 7309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_NUMBER); 7310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsNaN(ctxt->value->floatval)) 7311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval=xmlXPathNAN; 7312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (xmlXPathIsInf(ctxt->value->floatval) == 1) 7313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval=xmlXPathNINF; 7314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (xmlXPathIsInf(ctxt->value->floatval) == -1) 7315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval=xmlXPathPINF; 7316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (ctxt->value->floatval == 0) { 7317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathGetSign(ctxt->value->floatval) == 0) 7318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = xmlXPathNZERO; 7319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = 0; 7321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 7323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = - ctxt->value->floatval; 7324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathAddValues: 7328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the add operation on XPath objects: 7331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The numeric operators convert their operands to numbers as if 7332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by calling the number function. 7333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 7335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathAddValues(xmlXPathParserContextPtr ctxt) { 7336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg; 7337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double val; 7338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg = valuePop(ctxt); 7340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg == NULL) 7341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_OPERAND); 7342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlXPathCastToNumber(arg); 7343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg); 7344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_NUMBER; 7345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_NUMBER); 7346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval += val; 7347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathSubValues: 7351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the subtraction operation on XPath objects: 7354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The numeric operators convert their operands to numbers as if 7355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by calling the number function. 7356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 7358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathSubValues(xmlXPathParserContextPtr ctxt) { 7359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg; 7360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double val; 7361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg = valuePop(ctxt); 7363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg == NULL) 7364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_OPERAND); 7365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlXPathCastToNumber(arg); 7366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg); 7367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_NUMBER; 7368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_NUMBER); 7369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval -= val; 7370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathMultValues: 7374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the multiply operation on XPath objects: 7377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The numeric operators convert their operands to numbers as if 7378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by calling the number function. 7379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 7381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathMultValues(xmlXPathParserContextPtr ctxt) { 7382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg; 7383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double val; 7384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg = valuePop(ctxt); 7386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg == NULL) 7387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_OPERAND); 7388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlXPathCastToNumber(arg); 7389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg); 7390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_NUMBER; 7391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_NUMBER); 7392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval *= val; 7393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathDivValues: 7397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the div operation on XPath objects @arg1 / @arg2: 7400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The numeric operators convert their operands to numbers as if 7401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by calling the number function. 7402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 7404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDivValues(xmlXPathParserContextPtr ctxt) { 7405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg; 7406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double val; 7407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg = valuePop(ctxt); 7409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg == NULL) 7410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_OPERAND); 7411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlXPathCastToNumber(arg); 7412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg); 7413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_NUMBER; 7414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_NUMBER); 7415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsNaN(val) || xmlXPathIsNaN(ctxt->value->floatval)) 7416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = xmlXPathNAN; 7417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (val == 0 && xmlXPathGetSign(val) != 0) { 7418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->floatval == 0) 7419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = xmlXPathNAN; 7420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (ctxt->value->floatval > 0) 7421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = xmlXPathNINF; 7422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (ctxt->value->floatval < 0) 7423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = xmlXPathPINF; 7424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (val == 0) { 7426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->floatval == 0) 7427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = xmlXPathNAN; 7428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (ctxt->value->floatval > 0) 7429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = xmlXPathPINF; 7430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (ctxt->value->floatval < 0) 7431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = xmlXPathNINF; 7432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 7433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval /= val; 7434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathModValues: 7438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the mod operation on XPath objects: @arg1 / @arg2 7441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The numeric operators convert their operands to numbers as if 7442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by calling the number function. 7443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 7445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathModValues(xmlXPathParserContextPtr ctxt) { 7446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg; 7447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double arg1, arg2; 7448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg = valuePop(ctxt); 7450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg == NULL) 7451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_OPERAND); 7452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2 = xmlXPathCastToNumber(arg); 7453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg); 7454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_NUMBER; 7455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_NUMBER); 7456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = ctxt->value->floatval; 7457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (arg2 == 0) 7458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = xmlXPathNAN; 7459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 7460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = fmod(arg1, arg2); 7461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 7465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 7466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The traversal functions * 7467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 7468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 7469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 7471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A traversal function enumerates nodes along an axis. 7472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initially it must be called with NULL, and it indicates 7473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * termination on the axis by returning NULL. 7474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlNodePtr (*xmlXPathTraversalFunction) 7476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathParserContextPtr ctxt, xmlNodePtr cur); 7477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 7479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathTraversalFunctionExt: 7480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A traversal function enumerates nodes along an axis. 7481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initially it must be called with NULL, and it indicates 7482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * termination on the axis by returning NULL. 7483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The context node of the traversal is specified via @contextNode. 7484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlNodePtr (*xmlXPathTraversalFunctionExt) 7486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlNodePtr cur, xmlNodePtr contextNode); 7487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 7489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetMergeFunction: 7490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Used for merging node sets in xmlXPathCollectAndTest(). 7491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlNodeSetPtr (*xmlXPathNodeSetMergeFunction) 7493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlNodeSetPtr, xmlNodeSetPtr, int); 7494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextSelf: 7498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 7500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "self" direction 7502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The self axis contains just the context node itself 7503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 7505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 7507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 7508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 7509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 7510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->context->node); 7511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextChild: 7516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 7518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "child" direction 7520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The child axis contains the children of the context node in document order. 7521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 7523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 7525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextChild(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 7526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 7527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 7528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node == NULL) return(NULL); 7529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (ctxt->context->node->type) { 7530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 7531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 7532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 7533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_REF_NODE: 7534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_NODE: 7535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 7536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 7537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NOTATION_NODE: 7538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DTD_NODE: 7539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->context->node->children); 7540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_NODE: 7541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_TYPE_NODE: 7542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_FRAG_NODE: 7543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_HTML_DOCUMENT_NODE: 7544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED 7545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCB_DOCUMENT_NODE: 7546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(((xmlDocPtr) ctxt->context->node)->children); 7548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_DECL: 7549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_DECL: 7550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_DECL: 7551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: 7552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: 7553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_START: 7554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_END: 7555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_DOCUMENT_NODE) || 7560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_HTML_DOCUMENT_NODE)) 7561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur->next); 7563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextChildElement: 7567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 7569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "child" direction and nodes of type element. 7571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The child axis contains the children of the context node in document order. 7572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 7574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr 7576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextChildElement(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 7577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 7578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 7579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->context->node; 7580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) return(NULL); 7581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the first element child. 7583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 7585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 7586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_FRAG_NODE: 7587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_REF_NODE: /* URGENT TODO: entify-refs as well? */ 7588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_NODE: 7589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->children; 7590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != NULL) { 7591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_ELEMENT_NODE) 7592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 7593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 7594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 7595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while ((cur != NULL) && 7596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type != XML_ELEMENT_NODE)); 7597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 7598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_NODE: 7601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_HTML_DOCUMENT_NODE: 7602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED 7603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCB_DOCUMENT_NODE: 7604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlDocGetRootElement((xmlDocPtr) cur)); 7606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 7607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the next sibling element node. 7613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 7615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 7616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 7617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_REF_NODE: 7618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_NODE: 7619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 7620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 7621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 7622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_END: 7623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* case XML_DTD_NODE: */ /* URGENT TODO: DTD-node as well? */ 7625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 7626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) { 7629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next->type == XML_ELEMENT_NODE) 7630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur->next); 7631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 7632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 7633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 7634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while ((cur != NULL) && (cur->type != XML_ELEMENT_NODE)); 7635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 7636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextDescendantOrSelfElemParent: 7642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 7644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "descendant-or-self" axis. 7646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Additionally it returns only nodes which can be parents of 7647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element nodes. 7648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 7651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr 7653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextDescendantOrSelfElemParent(xmlNodePtr cur, 7654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr contextNode) 7655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 7656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 7657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextNode == NULL) 7658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (contextNode->type) { 7660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 7661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_START: 7662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_FRAG_NODE: 7663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_NODE: 7664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED 7665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCB_DOCUMENT_NODE: 7666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_HTML_DOCUMENT_NODE: 7668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(contextNode); 7669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 7670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr start = cur; 7675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 7677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 7678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 7679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO: OK to have XInclude here? */ 7680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_START: 7681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_FRAG_NODE: 7682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != start) 7683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 7684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->children != NULL) { 7685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->children; 7686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 7687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Not sure if we need those here. */ 7690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_NODE: 7691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED 7692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCB_DOCUMENT_NODE: 7693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_HTML_DOCUMENT_NODE: 7695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != start) 7696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 7697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlDocGetRootElement((xmlDocPtr) cur)); 7698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 7699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 7700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext_sibling: 7703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == NULL) || (cur == contextNode)) 7704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) { 7706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 7707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 7708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->parent; 7709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto next_sibling; 7710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextDescendant: 7718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 7720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "descendant" direction 7722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the descendant axis contains the descendants of the context node in document 7723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * order; a descendant is a child or a child of a child and so on. 7724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 7726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 7728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextDescendant(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 7729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 7730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 7731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node == NULL) 7732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) || 7734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->context->node->type == XML_NAMESPACE_DECL)) 7735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node == (xmlNodePtr) ctxt->context->doc) 7738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->context->doc->children); 7739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->context->node->children); 7740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->children != NULL) { 7743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Do not descend on entities declarations 7745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->children->type != XML_ENTITY_DECL) { 7747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->children; 7748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip DTDs 7750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type != XML_DTD_NODE) 7752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 7753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == ctxt->context->node) return(NULL); 7757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur->next != NULL) { 7759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 7760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type != XML_ENTITY_DECL) && 7761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type != XML_DTD_NODE)) 7762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 7763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 7766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->parent; 7767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) break; 7768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == ctxt->context->node) return(NULL); 7769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) { 7770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 7771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 7772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (cur != NULL); 7774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 7775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextDescendantOrSelf: 7779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 7781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "descendant-or-self" direction 7783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the descendant-or-self axis contains the context node and the descendants 7784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the context node in document order; thus the context node is the first 7785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node on the axis, and the first child of the context node is the second node 7786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * on the axis 7787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 7789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 7791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextDescendantOrSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 7792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 7793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 7794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node == NULL) 7795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) || 7797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->context->node->type == XML_NAMESPACE_DECL)) 7798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->context->node); 7800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNextDescendant(ctxt, cur)); 7803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextParent: 7807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 7809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "parent" direction 7811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The parent axis contains the parent of the context node, if there is one. 7812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 7814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 7816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextParent(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 7817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 7818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the parent of an attribute or namespace node is the element 7820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to which the attribute or namespace node is attached 7821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Namespace handling !!! 7822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 7824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node == NULL) return(NULL); 7825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (ctxt->context->node->type) { 7826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 7827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 7828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 7829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_REF_NODE: 7830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_NODE: 7831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 7832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 7833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NOTATION_NODE: 7834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DTD_NODE: 7835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_DECL: 7836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_DECL: 7837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_START: 7838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_END: 7839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_DECL: 7840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node->parent == NULL) 7841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlNodePtr) ctxt->context->doc); 7842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->context->node->parent->type == XML_ELEMENT_NODE) && 7843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ctxt->context->node->parent->name[0] == ' ') || 7844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(ctxt->context->node->parent->name, 7845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "fake node libxslt")))) 7846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->context->node->parent); 7848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: { 7849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr att = (xmlAttrPtr) ctxt->context->node; 7850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(att->parent); 7852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_NODE: 7854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_TYPE_NODE: 7855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_FRAG_NODE: 7856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_HTML_DOCUMENT_NODE: 7857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED 7858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCB_DOCUMENT_NODE: 7859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: { 7862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns = (xmlNsPtr) ctxt->context->node; 7863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns->next != NULL) && 7865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ns->next->type != XML_NAMESPACE_DECL)) 7866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlNodePtr) ns->next); 7867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 7875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextAncestor: 7876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 7877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 7878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "ancestor" direction 7880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the ancestor axis contains the ancestors of the context node; the ancestors 7881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the context node consist of the parent of context node and the parent's 7882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parent and so on; the nodes are ordered in reverse document order; thus the 7883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parent is the first node on the axis, and the parent's parent is the second 7884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node on the axis 7885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 7886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 7887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 7889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextAncestor(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 7890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 7891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 7892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the parent of an attribute or namespace node is the element 7893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to which the attribute or namespace node is attached 7894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * !!!!!!!!!!!!! 7895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 7896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 7897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node == NULL) return(NULL); 7898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (ctxt->context->node->type) { 7899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 7900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 7901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 7902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_REF_NODE: 7903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_NODE: 7904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 7905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 7906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DTD_NODE: 7907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_DECL: 7908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_DECL: 7909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_DECL: 7910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NOTATION_NODE: 7911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_START: 7912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_END: 7913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node->parent == NULL) 7914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlNodePtr) ctxt->context->doc); 7915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->context->node->parent->type == XML_ELEMENT_NODE) && 7916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ctxt->context->node->parent->name[0] == ' ') || 7917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(ctxt->context->node->parent->name, 7918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "fake node libxslt")))) 7919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->context->node->parent); 7921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: { 7922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr tmp = (xmlAttrPtr) ctxt->context->node; 7923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(tmp->parent); 7925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_NODE: 7927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_TYPE_NODE: 7928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_FRAG_NODE: 7929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_HTML_DOCUMENT_NODE: 7930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED 7931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCB_DOCUMENT_NODE: 7932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: { 7935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns = (xmlNsPtr) ctxt->context->node; 7936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns->next != NULL) && 7938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ns->next->type != XML_NAMESPACE_DECL)) 7939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlNodePtr) ns->next); 7940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Bad, how did that namespace end up here ? */ 7941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == ctxt->context->doc->children) 7947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlNodePtr) ctxt->context->doc); 7948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == (xmlNodePtr) ctxt->context->doc) 7949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 7951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 7952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 7953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 7954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_REF_NODE: 7955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_NODE: 7956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 7957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 7958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NOTATION_NODE: 7959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DTD_NODE: 7960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_DECL: 7961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_DECL: 7962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_DECL: 7963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_START: 7964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_END: 7965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->parent == NULL) 7966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->parent->type == XML_ELEMENT_NODE) && 7968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((cur->parent->name[0] == ' ') || 7969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(cur->parent->name, 7970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "fake node libxslt")))) 7971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur->parent); 7973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: { 7974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr att = (xmlAttrPtr) ctxt->context->node; 7975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(att->parent); 7977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: { 7979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns = (xmlNsPtr) ctxt->context->node; 7980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns->next != NULL) && 7982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ns->next->type != XML_NAMESPACE_DECL)) 7983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlNodePtr) ns->next); 7984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Bad, how did that namespace end up here ? */ 7985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_NODE: 7988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_TYPE_NODE: 7989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_FRAG_NODE: 7990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_HTML_DOCUMENT_NODE: 7991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED 7992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCB_DOCUMENT_NODE: 7993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 7994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 7996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 7997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 7998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 7999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextAncestorOrSelf: 8001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 8003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "ancestor-or-self" direction 8005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * he ancestor-or-self axis contains the context node and ancestors of 8006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the context node in reverse document order; thus the context node is 8007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the first node on the axis, and the context node's parent the second; 8008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parent here is defined the same as with the parent axis. 8009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 8011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 8013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextAncestorOrSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 8014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 8015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 8016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->context->node); 8017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNextAncestor(ctxt, cur)); 8018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextFollowingSibling: 8022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 8024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "following-sibling" direction 8026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The following-sibling axis contains the following siblings of the context 8027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node in document order. 8028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 8030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 8032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextFollowingSibling(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 8033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 8034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) || 8035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->context->node->type == XML_NAMESPACE_DECL)) 8036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == (xmlNodePtr) ctxt->context->doc) 8038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 8040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->context->node->next); 8041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur->next); 8042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextPrecedingSibling: 8046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 8048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "preceding-sibling" direction 8050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The preceding-sibling axis contains the preceding siblings of the context 8051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node in reverse document order; the first preceding sibling is first on the 8052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * axis; the sibling preceding that node is the second on the axis and so on. 8053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 8055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 8057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextPrecedingSibling(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 8058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 8059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) || 8060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->context->node->type == XML_NAMESPACE_DECL)) 8061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == (xmlNodePtr) ctxt->context->doc) 8063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 8065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->context->node->prev); 8066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE)) { 8067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->prev; 8068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 8069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->context->node->prev); 8070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur->prev); 8072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextFollowing: 8076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 8078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "following" direction 8080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The following axis contains all nodes in the same document as the context 8081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node that are after the context node in document order, excluding any 8082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * descendants and excluding attribute nodes and namespace nodes; the nodes 8083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * are ordered in document order 8084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 8086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 8088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextFollowing(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 8089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 8090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != NULL && cur->children != NULL) 8091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return cur->children ; 8092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) cur = ctxt->context->node; 8093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) return(NULL) ; /* ERROR */ 8094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) return(cur->next) ; 8095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 8096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->parent; 8097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) break; 8098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == (xmlNodePtr) ctxt->context->doc) return(NULL); 8099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) return(cur->next); 8100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (cur != NULL); 8101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 8102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 8105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIsAncestor: 8106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ancestor: the ancestor node 8107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the current node 8108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check that @ancestor is a @node's ancestor 8110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if @ancestor is a @node's ancestor, 0 otherwise. 8112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 8114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIsAncestor(xmlNodePtr ancestor, xmlNodePtr node) { 8115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ancestor == NULL) || (node == NULL)) return(0); 8116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* nodes need to be in the same document */ 8117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ancestor->doc != node->doc) return(0); 8118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* avoid searching if ancestor or node is the root node */ 8119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ancestor == (xmlNodePtr) node->doc) return(1); 8120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == (xmlNodePtr) ancestor->doc) return(0); 8121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (node->parent != NULL) { 8122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->parent == ancestor) 8123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 8124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = node->parent; 8125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 8127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextPreceding: 8131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 8133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "preceding" direction 8135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the preceding axis contains all nodes in the same document as the context 8136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node that are before the context node in document order, excluding any 8137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ancestors and excluding attribute nodes and namespace nodes; the nodes are 8138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ordered in reverse document order 8139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 8141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 8143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextPreceding(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) 8144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 8146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 8147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->context->node; 8148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 8149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 8150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE)) 8151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->prev; 8152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 8153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->prev != NULL) { 8154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (cur = cur->prev; cur->last != NULL; cur = cur->last) ; 8155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (cur); 8156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->parent; 8159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 8160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 8161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == ctxt->context->doc->children) 8162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 8163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (xmlXPathIsAncestor(cur, ctxt->context->node)); 8164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (cur); 8165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextPrecedingInternal: 8169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the traversal 8171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "preceding" direction 8173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the preceding axis contains all nodes in the same document as the context 8174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node that are before the context node in document order, excluding any 8175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ancestors and excluding attribute nodes and namespace nodes; the nodes are 8176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ordered in reverse document order 8177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is a faster implementation but internal only since it requires a 8178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * state kept in the parser context: ctxt->ancestor. 8179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 8181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr 8183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextPrecedingInternal(xmlXPathParserContextPtr ctxt, 8184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur) 8185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 8187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 8188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->context->node; 8189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 8190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 8191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_NAMESPACE_DECL) 8192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = (xmlNodePtr)((xmlNsPtr)cur)->next; 8193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->ancestor = cur->parent; 8194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE)) 8196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->prev; 8197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur->prev == NULL) { 8198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->parent; 8199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 8200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 8201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == ctxt->context->doc->children) 8202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 8203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != ctxt->ancestor) 8204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (cur); 8205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->ancestor = cur->parent; 8206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->prev; 8208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur->last != NULL) 8209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->last; 8210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (cur); 8211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextNamespace: 8215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current attribute in the traversal 8217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "namespace" direction 8219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the namespace axis contains the namespace nodes of the context node; 8220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the order of nodes on this axis is implementation-defined; the axis will 8221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be empty unless the context node is an element 8222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We keep the XML namespace node at the end of the list. 8224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 8226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 8228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextNamespace(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 8229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 8230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node->type != XML_ELEMENT_NODE) return(NULL); 8231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->tmpNsList == NULL && cur != (xmlNodePtr) xmlXPathXMLNamespace) { 8232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->tmpNsList != NULL) 8233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->context->tmpNsList); 8234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->tmpNsList = 8235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGetNsList(ctxt->context->doc, ctxt->context->node); 8236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->tmpNsNr = 0; 8237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->tmpNsList != NULL) { 8238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (ctxt->context->tmpNsList[ctxt->context->tmpNsNr] != NULL) { 8239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->tmpNsNr++; 8240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlNodePtr) xmlXPathXMLNamespace); 8243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->tmpNsNr > 0) { 8245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlNodePtr)ctxt->context->tmpNsList[--ctxt->context->tmpNsNr]; 8246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->tmpNsList != NULL) 8248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt->context->tmpNsList); 8249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->tmpNsList = NULL; 8250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNextAttribute: 8256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current attribute in the traversal 8258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traversal function for the "attribute" direction 8260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: support DTD inherited default attributes 8261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next element following that axis 8263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNodePtr 8265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNextAttribute(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { 8266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); 8267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node == NULL) 8268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node->type != XML_ELEMENT_NODE) 8270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 8272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node == (xmlNodePtr) ctxt->context->doc) 8273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 8274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlNodePtr)ctxt->context->node->properties); 8275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlNodePtr)cur->next); 8277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 8280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 8281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NodeTest Functions * 8282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 8283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 8284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_FUNCTION 200 8286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 8289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 8290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implicit tree core function library * 8291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 8292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 8293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRoot: 8296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initialize the context to the root of the document 8299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRoot(xmlXPathParserContextPtr ctxt) { 8302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) 8303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = (xmlNodePtr) ctxt->context->doc; 8305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, 8306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node)); 8307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 8310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 8311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The explicit core function library * 8312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *http://www.w3.org/Style/XSL/Group/1999/07/xpath-19990705.html#corelib * 8313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 8314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 8315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathLastFunction: 8319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 8321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the last() XPath function 8323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number last() 8324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The last function returns the number of nodes in the context node list. 8325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathLastFunction(xmlXPathParserContextPtr ctxt, int nargs) { 8328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(0); 8329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->contextSize >= 0) { 8330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 8331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheNewFloat(ctxt->context, 8332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (double) ctxt->context->contextSize)); 8333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 8334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 8335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "last() : %d\n", ctxt->context->contextSize); 8336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_CTXT_SIZE); 8339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathPositionFunction: 8344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 8346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the position() XPath function 8348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number position() 8349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The position function returns the position of the context node in the 8350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context node list. The first position is 1, and so the last position 8351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will be equal to last(). 8352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathPositionFunction(xmlXPathParserContextPtr ctxt, int nargs) { 8355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(0); 8356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->proximityPosition >= 0) { 8357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 8358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheNewFloat(ctxt->context, 8359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (double) ctxt->context->proximityPosition)); 8360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 8361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "position() : %d\n", 8362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition); 8363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 8364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_CTXT_POSITION); 8366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCountFunction: 8371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 8373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the count() XPath function 8375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number count(node-set) 8376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCountFunction(xmlXPathParserContextPtr ctxt, int nargs) { 8379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr cur; 8380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 8382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value == NULL) || 8383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ctxt->value->type != XPATH_NODESET) && 8384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->type != XPATH_XSLT_TREE))) 8385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_TYPE); 8386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = valuePop(ctxt); 8387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == NULL) || (cur->nodesetval == NULL)) 8389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (double) 0)); 8390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((cur->type == XPATH_NODESET) || (cur->type == XPATH_XSLT_TREE)) { 8391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, 8392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (double) cur->nodesetval->nodeNr)); 8393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->nodesetval->nodeNr != 1) || 8395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->nodesetval->nodeTab == NULL)) { 8396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (double) 0)); 8397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr tmp; 8399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i = 0; 8400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = cur->nodesetval->nodeTab[0]; 8402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != NULL) { 8403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->children; 8404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tmp != NULL) { 8405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = tmp->next; 8406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i++; 8407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (double) i)); 8410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, cur); 8413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathGetElementsByIds: 8417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 8418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ids: a whitespace separated list of IDs 8419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Selects elements by their unique ID. 8421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a node-set of selected elements. 8423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodeSetPtr 8425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathGetElementsByIds (xmlDocPtr doc, const xmlChar *ids) { 8426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ret; 8427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *cur = ids; 8428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ID; 8429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr attr; 8430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr elem = NULL; 8431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ids == NULL) return(NULL); 8433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNodeSetCreate(NULL); 8435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*cur)) cur++; 8437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*cur != 0) { 8438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((!IS_BLANK_CH(*cur)) && (*cur != 0)) 8439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 8440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ID = xmlStrndup(ids, cur - ids); 8442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ID != NULL) { 8443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 8444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We used to check the fact that the value passed 8445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * was an NCName, but this generated much troubles for 8446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * me and Aleksey Sanin, people blatantly violated that 8447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * constaint, like Visa3D spec. 8448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if (xmlValidateNCName(ID, 1) == 0) 8449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr = xmlGetID(doc, ID); 8451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr != NULL) { 8452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (attr->type == XML_ATTRIBUTE_NODE) 8453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem = attr->parent; 8454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (attr->type == XML_ELEMENT_NODE) 8455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem = (xmlNodePtr) attr; 8456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project elem = NULL; 8458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (elem != NULL) 8459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAdd(ret, elem); 8460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ID); 8462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*cur)) cur++; 8465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ids = cur; 8466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 8468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIdFunction: 8472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 8474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the id() XPath function 8476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set id(object) 8477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The id function selects elements by their unique ID 8478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (see [5.2.1 Unique IDs]). When the argument to id is of type node-set, 8479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the result is the union of the result of applying id to the 8480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string value of each of the nodes in the argument node-set. When the 8481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument to id is of any other type, the argument is converted to a 8482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string as if by a call to the string function; the string is split 8483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * into a whitespace-separated list of tokens (whitespace is any sequence 8484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of characters matching the production S); the result is a node-set 8485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * containing the elements in the same document as the context node that 8486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * have a unique ID equal to any of the tokens in the list. 8487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIdFunction(xmlXPathParserContextPtr ctxt, int nargs) { 8490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *tokens; 8491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ret; 8492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr obj; 8493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 8495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 8496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj == NULL) XP_ERROR(XPATH_INVALID_OPERAND); 8497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((obj->type == XPATH_NODESET) || (obj->type == XPATH_XSLT_TREE)) { 8498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr ns; 8499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 8500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNodeSetCreate(NULL); 8502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (obj->nodesetval != NULL) { 8504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < obj->nodesetval->nodeNr; i++) { 8505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tokens = 8506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCastNodeToString(obj->nodesetval->nodeTab[i]); 8507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = xmlXPathGetElementsByIds(ctxt->context->doc, tokens); 8508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathNodeSetMerge(ret, ns); 8509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeNodeSet(ns); 8510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tokens != NULL) 8511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(tokens); 8512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 8515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context, ret)); 8516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = xmlXPathCacheConvertString(ctxt->context, obj); 8519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathGetElementsByIds(ctxt->context->doc, obj->stringval); 8520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context, ret)); 8521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 8522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathLocalNameFunction: 8527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 8529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the local-name() XPath function 8531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string local-name(node-set?) 8532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The local-name function returns a string containing the local part 8533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the name of the node in the argument node-set that is first in 8534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * document order. If the node-set is empty or the first node has no 8535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * name, an empty string is returned. If the argument is omitted it 8536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * defaults to the context node. 8537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathLocalNameFunction(xmlXPathParserContextPtr ctxt, int nargs) { 8540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr cur; 8541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return; 8543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nargs == 0) { 8545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, 8546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node)); 8547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nargs = 1; 8548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 8551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value == NULL) || 8552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ctxt->value->type != XPATH_NODESET) && 8553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->type != XPATH_XSLT_TREE))) 8554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_TYPE); 8555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = valuePop(ctxt); 8556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr == 0)) { 8558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); 8559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i = 0; /* Should be first in document order !!!!! */ 8561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->nodesetval->nodeTab[i]->type) { 8562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 8563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: 8564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 8565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodesetval->nodeTab[i]->name[0] == ' ') 8566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); 8567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 8569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheNewString(ctxt->context, 8570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodesetval->nodeTab[i]->name)); 8571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: 8573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, 8574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlNsPtr)cur->nodesetval->nodeTab[i])->prefix)); 8575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 8577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); 8578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, cur); 8581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNamespaceURIFunction: 8585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 8587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the namespace-uri() XPath function 8589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string namespace-uri(node-set?) 8590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The namespace-uri function returns a string containing the 8591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * namespace URI of the expanded name of the node in the argument 8592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set that is first in document order. If the node-set is empty, 8593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the first node has no name, or the expanded name has no namespace 8594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * URI, an empty string is returned. If the argument is omitted it 8595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * defaults to the context node. 8596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNamespaceURIFunction(xmlXPathParserContextPtr ctxt, int nargs) { 8599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr cur; 8600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return; 8602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nargs == 0) { 8604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, 8605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node)); 8606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nargs = 1; 8607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 8609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value == NULL) || 8610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ctxt->value->type != XPATH_NODESET) && 8611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->type != XPATH_XSLT_TREE))) 8612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_TYPE); 8613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = valuePop(ctxt); 8614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr == 0)) { 8616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); 8617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i = 0; /* Should be first in document order !!!!! */ 8619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->nodesetval->nodeTab[i]->type) { 8620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 8621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: 8622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodesetval->nodeTab[i]->ns == NULL) 8623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); 8624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, 8626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodesetval->nodeTab[i]->ns->href)); 8627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 8629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); 8630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, cur); 8633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNameFunction: 8637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 8639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the name() XPath function 8641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string name(node-set?) 8642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The name function returns a string containing a QName representing 8643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the name of the node in the argument node-set that is first in document 8644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * order. The QName must represent the name with respect to the namespace 8645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * declarations in effect on the node whose name is being represented. 8646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Typically, this will be the form in which the name occurred in the XML 8647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * source. This need not be the case if there are namespace declarations 8648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in effect on the node that associate multiple prefixes with the same 8649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * namespace. However, an implementation may include information about 8650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the original prefix in its representation of nodes; in this case, an 8651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * implementation can ensure that the returned string is always the same 8652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * as the QName used in the XML source. If the argument it omitted it 8653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * defaults to the context node. 8654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Libxml keep the original prefix so the "real qualified name" used is 8655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returned. 8656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 8658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNameFunction(xmlXPathParserContextPtr ctxt, int nargs) 8659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 8660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr cur; 8661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nargs == 0) { 8663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, 8664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node)); 8665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nargs = 1; 8666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 8669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value == NULL) || 8670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ctxt->value->type != XPATH_NODESET) && 8671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->type != XPATH_XSLT_TREE))) 8672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_TYPE); 8673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = valuePop(ctxt); 8674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr == 0)) { 8676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); 8677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i = 0; /* Should be first in document order !!!!! */ 8679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->nodesetval->nodeTab[i]->type) { 8681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 8682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: 8683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->nodesetval->nodeTab[i]->name[0] == ' ') 8684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 8685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheNewCString(ctxt->context, "")); 8686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((cur->nodesetval->nodeTab[i]->ns == NULL) || 8687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->nodesetval->nodeTab[i]->ns->prefix == NULL)) { 8688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 8689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheNewString(ctxt->context, 8690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodesetval->nodeTab[i]->name)); 8691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *fullname; 8693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fullname = xmlBuildQName(cur->nodesetval->nodeTab[i]->name, 8695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodesetval->nodeTab[i]->ns->prefix, 8696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, 0); 8697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (fullname == cur->nodesetval->nodeTab[i]->name) 8698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fullname = xmlStrdup(cur->nodesetval->nodeTab[i]->name); 8699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (fullname == NULL) { 8700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_MEMORY_ERROR); 8701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheWrapString( 8703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context, fullname)); 8704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 8706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 8707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, 8708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodesetval->nodeTab[i])); 8709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathLocalNameFunction(ctxt, 1); 8710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, cur); 8713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathStringFunction: 8718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 8720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the string() XPath function 8722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string string(object?) 8723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The string function converts an object to a string as follows: 8724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - A node-set is converted to a string by returning the value of 8725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the node in the node-set that is first in document order. 8726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the node-set is empty, an empty string is returned. 8727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - A number is converted to a string as follows 8728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * + NaN is converted to the string NaN 8729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * + positive zero is converted to the string 0 8730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * + negative zero is converted to the string 0 8731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * + positive infinity is converted to the string Infinity 8732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * + negative infinity is converted to the string -Infinity 8733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * + if the number is an integer, the number is represented in 8734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * decimal form as a Number with no decimal point and no leading 8735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * zeros, preceded by a minus sign (-) if the number is negative 8736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * + otherwise, the number is represented in decimal form as a 8737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Number including a decimal point with at least one digit 8738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * before the decimal point and at least one digit after the 8739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * decimal point, preceded by a minus sign (-) if the number 8740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is negative; there must be no leading zeros before the decimal 8741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * point apart possibly from the one required digit immediately 8742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * before the decimal point; beyond the one required digit 8743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * after the decimal point there must be as many, but only as 8744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * many, more digits as are needed to uniquely distinguish the 8745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number from all other IEEE 754 numeric values. 8746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - The boolean false value is converted to the string false. 8747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The boolean true value is converted to the string true. 8748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the argument is omitted, it defaults to a node-set with the 8750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context node as its only member. 8751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathStringFunction(xmlXPathParserContextPtr ctxt, int nargs) { 8754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr cur; 8755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return; 8757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nargs == 0) { 8758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 8759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheWrapString(ctxt->context, 8760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCastNodeToString(ctxt->context->node))); 8761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 8765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = valuePop(ctxt); 8766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) XP_ERROR(XPATH_INVALID_OPERAND); 8767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheConvertString(ctxt->context, cur)); 8768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathStringLengthFunction: 8772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 8774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the string-length() XPath function 8776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number string-length(string?) 8777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The string-length returns the number of characters in the string 8778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (see [3.6 Strings]). If the argument is omitted, it defaults to 8779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the context node converted to a string, in other words the value 8780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the context node. 8781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathStringLengthFunction(xmlXPathParserContextPtr ctxt, int nargs) { 8784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr cur; 8785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nargs == 0) { 8787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->context == NULL)) 8788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node == NULL) { 8790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, 0)); 8791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 8792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *content; 8793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project content = xmlXPathCastNodeToString(ctxt->context->node); 8795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, 8796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlUTF8Strlen(content))); 8797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(content); 8798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 8802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 8803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_STRING); 8804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = valuePop(ctxt); 8805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, 8806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlUTF8Strlen(cur->stringval))); 8807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, cur); 8808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathConcatFunction: 8812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 8814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the concat() XPath function 8816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string concat(string, string, string*) 8817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The concat function returns the concatenation of its arguments. 8818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathConcatFunction(xmlXPathParserContextPtr ctxt, int nargs) { 8821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr cur, newobj; 8822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *tmp; 8823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return; 8825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nargs < 2) { 8826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(2); 8827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 8830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = valuePop(ctxt); 8831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == NULL) || (cur->type != XPATH_STRING)) { 8832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, cur); 8833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 8834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nargs--; 8836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (nargs > 0) { 8838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 8839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newobj = valuePop(ctxt); 8840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((newobj == NULL) || (newobj->type != XPATH_STRING)) { 8841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, newobj); 8842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, cur); 8843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_TYPE); 8844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlStrcat(newobj->stringval, cur->stringval); 8846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newobj->stringval = cur->stringval; 8847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->stringval = tmp; 8848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, newobj); 8849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nargs--; 8850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, cur); 8852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathContainsFunction: 8856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 8858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the contains() XPath function 8860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * boolean contains(string, string) 8861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The contains function returns true if the first argument string 8862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * contains the second argument string, and otherwise returns false. 8863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathContainsFunction(xmlXPathParserContextPtr ctxt, int nargs) { 8866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr hay, needle; 8867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(2); 8869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 8870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_STRING); 8871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project needle = valuePop(ctxt); 8872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 8873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hay = valuePop(ctxt); 8874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((hay == NULL) || (hay->type != XPATH_STRING)) { 8876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, hay); 8877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, needle); 8878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_TYPE); 8879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrstr(hay->stringval, needle->stringval)) 8881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1)); 8882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0)); 8884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, hay); 8885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, needle); 8886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathStartsWithFunction: 8890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 8892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the starts-with() XPath function 8894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * boolean starts-with(string, string) 8895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The starts-with function returns true if the first argument string 8896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * starts with the second argument string, and otherwise returns false. 8897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathStartsWithFunction(xmlXPathParserContextPtr ctxt, int nargs) { 8900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr hay, needle; 8901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int n; 8902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(2); 8904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 8905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_STRING); 8906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project needle = valuePop(ctxt); 8907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 8908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hay = valuePop(ctxt); 8909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((hay == NULL) || (hay->type != XPATH_STRING)) { 8911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, hay); 8912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, needle); 8913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_TYPE); 8914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project n = xmlStrlen(needle->stringval); 8916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrncmp(hay->stringval, needle->stringval, n)) 8917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0)); 8918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 8919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1)); 8920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, hay); 8921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, needle); 8922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 8923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 8925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathSubstringFunction: 8926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 8927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 8928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the substring() XPath function 8930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string substring(string, number, number?) 8931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The substring function returns the substring of the first argument 8932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * starting at the position specified in the second argument with 8933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * length specified in the third argument. For example, 8934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * substring("12345",2,3) returns "234". If the third argument is not 8935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * specified, it returns the substring starting at the position specified 8936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in the second argument and continuing to the end of the string. For 8937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * example, substring("12345",2) returns "2345". More precisely, each 8938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * character in the string (see [3.6 Strings]) is considered to have a 8939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * numeric position: the position of the first character is 1, the position 8940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the second character is 2 and so on. The returned substring contains 8941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * those characters for which the position of the character is greater than 8942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or equal to the second argument and, if the third argument is specified, 8943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * less than the sum of the second and third arguments; the comparisons 8944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and addition used for the above follow the standard IEEE 754 rules. Thus: 8945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - substring("12345", 1.5, 2.6) returns "234" 8946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - substring("12345", 0, 3) returns "12" 8947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - substring("12345", 0 div 0, 3) returns "" 8948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - substring("12345", 1, 0 div 0) returns "" 8949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - substring("12345", -42, 1 div 0) returns "12345" 8950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - substring("12345", -1 div 0, 1 div 0) returns "" 8951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 8953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathSubstringFunction(xmlXPathParserContextPtr ctxt, int nargs) { 8954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr str, start, len; 8955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double le=0, in; 8956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, l, m; 8957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret; 8958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nargs < 2) { 8960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(2); 8961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nargs > 3) { 8963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(3); 8964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 8966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * take care of possible last (position) argument 8967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nargs == 3) { 8969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_NUMBER; 8970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_NUMBER); 8971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = valuePop(ctxt); 8972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project le = len->floatval; 8973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, len); 8974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_NUMBER; 8977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_NUMBER); 8978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project start = valuePop(ctxt); 8979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in = start->floatval; 8980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, start); 8981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 8982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_STRING); 8983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = valuePop(ctxt); 8984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project m = xmlUTF8Strlen((const unsigned char *)str->stringval); 8985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 8987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If last pos not present, calculate last position 8988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nargs != 3) { 8990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project le = (double)m; 8991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (in < 1.0) 8992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in = 1.0; 8993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 8994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 8995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Need to check for the special cases where either 8996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the index is NaN, the length is NaN, or both 8997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * arguments are infinity (relying on Inf + -Inf = NaN) 8998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlXPathIsNaN(in + le) && !xmlXPathIsInf(in)) { 9000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * To meet the requirements of the spec, the arguments 9002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * must be converted to integer format before 9003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * initial index calculations are done 9004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * First we go to integer form, rounding up 9006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and checking for special cases 9007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = (int) in; 9009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((double)i)+0.5 <= in) i++; 9010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsInf(le) == 1) { 9012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l = m; 9013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (i < 1) 9014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = 1; 9015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (xmlXPathIsInf(le) == -1 || le < 0.0) 9017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l = 0; 9018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 9019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l = (int) le; 9020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((double)l)+0.5 <= le) l++; 9021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Now we normalize inidices */ 9024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i -= 1; 9025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l += i; 9026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (i < 0) 9027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = 0; 9028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (l > m) 9029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l = m; 9030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* number of chars to copy */ 9032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l -= i; 9033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlUTF8Strsub(str->stringval, i, l); 9035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 9037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = NULL; 9038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 9040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); 9041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 9042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, ret)); 9043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 9044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, str); 9046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathSubstringBeforeFunction: 9050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the substring-before() XPath function 9054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string substring-before(string, string) 9055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The substring-before function returns the substring of the first 9056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument string that precedes the first occurrence of the second 9057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument string in the first argument string, or the empty string 9058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if the first argument string does not contain the second argument 9059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string. For example, substring-before("1999/04/01","/") returns 1999. 9060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathSubstringBeforeFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr str; 9064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr find; 9065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferPtr target; 9066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *point; 9067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int offset; 9068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(2); 9070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 9071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project find = valuePop(ctxt); 9072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 9073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = valuePop(ctxt); 9074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target = xmlBufferCreate(); 9076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (target) { 9077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project point = xmlStrstr(str->stringval, find->stringval); 9078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (point) { 9079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project offset = (int)(point - str->stringval); 9080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferAdd(target, str->stringval, offset); 9081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, 9083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferContent(target))); 9084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferFree(target); 9085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, str); 9087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, find); 9088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathSubstringAfterFunction: 9092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the substring-after() XPath function 9096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string substring-after(string, string) 9097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The substring-after function returns the substring of the first 9098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument string that follows the first occurrence of the second 9099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument string in the first argument string, or the empty stringi 9100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if the first argument string does not contain the second argument 9101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string. For example, substring-after("1999/04/01","/") returns 04/01, 9102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and substring-after("1999/04/01","19") returns 99/04/01. 9103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathSubstringAfterFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr str; 9107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr find; 9108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferPtr target; 9109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *point; 9110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int offset; 9111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(2); 9113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 9114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project find = valuePop(ctxt); 9115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 9116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = valuePop(ctxt); 9117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target = xmlBufferCreate(); 9119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (target) { 9120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project point = xmlStrstr(str->stringval, find->stringval); 9121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (point) { 9122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project offset = (int)(point - str->stringval) + xmlStrlen(find->stringval); 9123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferAdd(target, &str->stringval[offset], 9124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStrlen(str->stringval) - offset); 9125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, 9127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferContent(target))); 9128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferFree(target); 9129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, str); 9131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, find); 9132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNormalizeFunction: 9136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the normalize-space() XPath function 9140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string normalize-space(string?) 9141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The normalize-space function returns the argument string with white 9142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * space normalized by stripping leading and trailing whitespace 9143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and replacing sequences of whitespace characters by a single 9144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * space. Whitespace characters are the same allowed by the S production 9145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in XML. If the argument is omitted, it defaults to the context 9146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node converted to a string, in other words the value of the context node. 9147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNormalizeFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr obj = NULL; 9151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *source = NULL; 9152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferPtr target; 9153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar blank; 9154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return; 9156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nargs == 0) { 9157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Use current context node */ 9158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 9159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheWrapString(ctxt->context, 9160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCastNodeToString(ctxt->context->node))); 9161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nargs = 1; 9162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 9165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 9166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_STRING); 9167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 9168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project source = obj->stringval; 9169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target = xmlBufferCreate(); 9171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (target && source) { 9172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Skip leading whitespaces */ 9174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*source)) 9175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project source++; 9176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Collapse intermediate whitespaces, and skip trailing whitespaces */ 9178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project blank = 0; 9179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*source) { 9180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_BLANK_CH(*source)) { 9181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project blank = 0x20; 9182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (blank) { 9184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferAdd(target, &blank, 1); 9185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project blank = 0; 9186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferAdd(target, source, 1); 9188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project source++; 9190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, 9192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferContent(target))); 9193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferFree(target); 9194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 9196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathTranslateFunction: 9200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the translate() XPath function 9204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string translate(string, string, string) 9205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The translate function returns the first argument string with 9206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * occurrences of characters in the second argument string replaced 9207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by the character at the corresponding position in the third argument 9208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string. For example, translate("bar","abc","ABC") returns the string 9209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * BAr. If there is a character in the second argument string with no 9210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * character at a corresponding position in the third argument string 9211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (because the second argument string is longer than the third argument 9212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string), then occurrences of that character in the first argument 9213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string are removed. For example, translate("--aaa--","abc-","ABC") 9214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns "AAA". If a character occurs more than once in second 9215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument string, then the first occurrence determines the replacement 9216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * character. If the third argument string is longer than the second 9217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument string, then excess characters are ignored. 9218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathTranslateFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr str; 9222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr from; 9223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr to; 9224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferPtr target; 9225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int offset, max; 9226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar ch; 9227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *point; 9228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *cptr; 9229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(3); 9231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 9233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = valuePop(ctxt); 9234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 9235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project from = valuePop(ctxt); 9236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 9237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = valuePop(ctxt); 9238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target = xmlBufferCreate(); 9240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (target) { 9241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max = xmlUTF8Strlen(to->stringval); 9242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (cptr = str->stringval; (ch=*cptr); ) { 9243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project offset = xmlUTF8Strloc(from->stringval, cptr); 9244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (offset >= 0) { 9245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (offset < max) { 9246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project point = xmlUTF8Strpos(to->stringval, offset); 9247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (point) 9248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferAdd(target, point, xmlUTF8Strsize(point, 1)); 9249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 9251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferAdd(target, cptr, xmlUTF8Strsize(cptr, 1)); 9252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Step to next character in input */ 9254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cptr++; 9255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( ch & 0x80 ) { 9256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* if not simple ascii, verify proper format */ 9257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( (ch & 0xc0) != 0xc0 ) { 9258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 9259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathTranslateFunction: Invalid UTF8 string\n"); 9260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* then skip over remaining bytes for this char */ 9263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ( (ch <<= 1) & 0x80 ) 9264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ( (*cptr++ & 0xc0) != 0x80 ) { 9265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 9266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathTranslateFunction: Invalid UTF8 string\n"); 9267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ch & 0x80) /* must have had error encountered */ 9270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 9271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, 9275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferContent(target))); 9276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferFree(target); 9277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, str); 9278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, from); 9279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, to); 9280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathBooleanFunction: 9284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the boolean() XPath function 9288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * boolean boolean(object) 9289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The boolean function converts its argument to a boolean as follows: 9290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - a number is true if and only if it is neither positive or 9291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * negative zero nor NaN 9292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - a node-set is true if and only if it is non-empty 9293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - a string is true if and only if its length is non-zero 9294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathBooleanFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr cur; 9298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 9300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = valuePop(ctxt); 9301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) XP_ERROR(XPATH_INVALID_OPERAND); 9302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlXPathCacheConvertBoolean(ctxt->context, cur); 9303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, cur); 9304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNotFunction: 9308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the not() XPath function 9312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * boolean not(boolean) 9313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The not function returns true if its argument is false, 9314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and false otherwise. 9315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNotFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 9319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_BOOLEAN; 9320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_BOOLEAN); 9321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->boolval = ! ctxt->value->boolval; 9322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathTrueFunction: 9326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the true() XPath function 9330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * boolean true() 9331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathTrueFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(0); 9335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1)); 9336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFalseFunction: 9340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the false() XPath function 9344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * boolean false() 9345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFalseFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(0); 9349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0)); 9350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathLangFunction: 9354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the lang() XPath function 9358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * boolean lang(string) 9359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The lang function returns true or false depending on whether the 9360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * language of the context node as specified by xml:lang attributes 9361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is the same as or is a sublanguage of the language specified by 9362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the argument string. The language of the context node is determined 9363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by the value of the xml:lang attribute on the context node, or, if 9364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the context node has no xml:lang attribute, by the value of the 9365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xml:lang attribute on the nearest ancestor of the context node that 9366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * has an xml:lang attribute. If there is no such attribute, then lang 9367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns false. If there is such an attribute, then lang returns 9368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * true if the attribute value is equal to the argument ignoring case, 9369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or if there is some suffix starting with - such that the attribute 9370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * value is equal to the argument ignoring that suffix of the attribute 9371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * value and ignoring case. 9372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathLangFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr val = NULL; 9376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *theLang = NULL; 9377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *lang; 9378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 9379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 9380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 9382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 9383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_STRING); 9384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = valuePop(ctxt); 9385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lang = val->stringval; 9386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project theLang = xmlNodeGetLang(ctxt->context->node); 9387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((theLang != NULL) && (lang != NULL)) { 9388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;lang[i] != 0;i++) 9389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (toupper(lang[i]) != toupper(theLang[i])) 9390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto not_equal; 9391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((theLang[i] == 0) || (theLang[i] == '-')) 9392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 9393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnot_equal: 9395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (theLang != NULL) 9396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((void *)theLang); 9397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, val); 9399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, ret)); 9400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNumberFunction: 9404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the number() XPath function 9408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number number(object?) 9409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNumberFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr cur; 9413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double res; 9414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return; 9416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nargs == 0) { 9417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->context->node == NULL) { 9418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, 0.0)); 9419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar* content = xmlNodeGetContent(ctxt->context->node); 9421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathStringEvalNumber(content); 9423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, res)); 9424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(content); 9425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 9427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 9430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = valuePop(ctxt); 9431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheConvertNumber(ctxt->context, cur)); 9432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathSumFunction: 9436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the sum() XPath function 9440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number sum(node-set) 9441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The sum function returns the sum of the values of the nodes in 9442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the argument node-set. 9443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathSumFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr cur; 9447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 9448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double res = 0.0; 9449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 9451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value == NULL) || 9452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ctxt->value->type != XPATH_NODESET) && 9453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->type != XPATH_XSLT_TREE))) 9454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_TYPE); 9455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = valuePop(ctxt); 9456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->nodesetval != NULL) && (cur->nodesetval->nodeNr != 0)) { 9458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < cur->nodesetval->nodeNr; i++) { 9459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res += xmlXPathCastNodeToNumber(cur->nodesetval->nodeTab[i]); 9460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, res)); 9463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, cur); 9464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 9467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * To assure working code on multiple platforms, we want to only depend 9468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * upon the characteristic truncation of converting a floating point value 9469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to an integer. Unfortunately, because of the different storage sizes 9470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of our internal floating point value (double) and integer (int), we 9471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * can't directly convert (see bug 301162). This macro is a messy 9472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 'workaround' 9473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XTRUNC(f, v) \ 9475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project f = fmod((v), INT_MAX); \ 9476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project f = (v) - (f) + (double)((int)(f)); 9477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathFloorFunction: 9480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the floor() XPath function 9484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number floor(number) 9485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The floor function returns the largest (closest to positive infinity) 9486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number that is not greater than the argument and that is an integer. 9487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathFloorFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double f; 9491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 9493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_NUMBER; 9494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_NUMBER); 9495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XTRUNC(f, ctxt->value->floatval); 9497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (f != ctxt->value->floatval) { 9498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->floatval > 0) 9499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = f; 9500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 9501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = f - 1; 9502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCeilingFunction: 9507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the ceiling() XPath function 9511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number ceiling(number) 9512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The ceiling function returns the smallest (closest to negative infinity) 9513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number that is not less than the argument and that is an integer. 9514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCeilingFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double f; 9518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 9520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_NUMBER; 9521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_NUMBER); 9522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 9524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = ceil(ctxt->value->floatval); 9525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 9526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XTRUNC(f, ctxt->value->floatval); 9527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (f != ctxt->value->floatval) { 9528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->floatval > 0) 9529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = f + 1; 9530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 9531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->floatval < 0 && f == 0) 9532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = xmlXPathNZERO; 9533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 9534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = f; 9535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 9539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRoundFunction: 9543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 9545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the round() XPath function 9547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number round(number) 9548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The round function returns the number that is closest to the 9549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * argument and that is an integer. If there are two such numbers, 9550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then the one that is even is returned. 9551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 9553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRoundFunction(xmlXPathParserContextPtr ctxt, int nargs) { 9554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double f; 9555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(1); 9557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_NUMBER; 9558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE(XPATH_NUMBER); 9559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((xmlXPathIsNaN(ctxt->value->floatval)) || 9561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathIsInf(ctxt->value->floatval) == 1) || 9562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathIsInf(ctxt->value->floatval) == -1) || 9563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->floatval == 0.0)) 9564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 9565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XTRUNC(f, ctxt->value->floatval); 9567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->floatval < 0) { 9568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->floatval < f - 0.5) 9569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = f - 1; 9570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 9571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = f; 9572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->floatval == 0) 9573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = xmlXPathNZERO; 9574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->floatval < f + 0.5) 9576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = f; 9577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 9578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->floatval = f + 1; 9579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 9583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 9584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The Parser * 9585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 9586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 9587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 9589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a few forward declarations since we use a recursive call based 9590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * implementation. 9591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlXPathCompileExpr(xmlXPathParserContextPtr ctxt, int sort); 9593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlXPathCompPredicate(xmlXPathParserContextPtr ctxt, int filter); 9594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlXPathCompLocationPath(xmlXPathParserContextPtr ctxt); 9595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlXPathCompRelativeLocationPath(xmlXPathParserContextPtr ctxt); 9596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * xmlXPathParseNameComplex(xmlXPathParserContextPtr ctxt, 9597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int qualified); 9598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCurrentChar: 9601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath parser context 9602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: pointer to the beginning of the char 9603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len: pointer to the length of the char read 9604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The current char value, if using UTF-8 this may actually span multiple 9606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * bytes in the input buffer. 9607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the current char value and its length 9609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 9612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCurrentChar(xmlXPathParserContextPtr ctxt, int *len) { 9613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned char c; 9614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int val; 9615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *cur; 9616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 9618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 9619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->cur; 9620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We are supposed to handle UTF8, check it's valid 9623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * From rfc2044: encoding of the Unicode values on UTF-8: 9624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * UCS-4 range (hex.) UTF-8 octet sequence (binary) 9626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0000 0000-0000 007F 0xxxxxxx 9627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0000 0080-0000 07FF 110xxxxx 10xxxxxx 9628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx 9629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for the 0x110000 limit too 9631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = *cur; 9633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (c & 0x80) { 9634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur[1] & 0xc0) != 0x80) 9635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto encoding_error; 9636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c & 0xe0) == 0xe0) { 9637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur[2] & 0xc0) != 0x80) 9639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto encoding_error; 9640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c & 0xf0) == 0xf0) { 9641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((c & 0xf8) != 0xf0) || 9642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((cur[3] & 0xc0) != 0x80)) 9643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto encoding_error; 9644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 4-byte code */ 9645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 4; 9646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = (cur[0] & 0x7) << 18; 9647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= (cur[1] & 0x3f) << 12; 9648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= (cur[2] & 0x3f) << 6; 9649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= cur[3] & 0x3f; 9650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 3-byte code */ 9652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 3; 9653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = (cur[0] & 0xf) << 12; 9654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= (cur[1] & 0x3f) << 6; 9655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= cur[2] & 0x3f; 9656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2-byte code */ 9659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 2; 9660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = (cur[0] & 0x1f) << 6; 9661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= cur[1] & 0x3f; 9662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_CHAR(val)) { 9664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR0(XPATH_INVALID_CHAR_ERROR); 9665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(val); 9667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 9668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1-byte code */ 9669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 1; 9670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((int) *cur); 9671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectencoding_error: 9673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If we detect an UTF8 error that probably means that the 9675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * input encoding didn't get properly advertised in the 9676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * declaration header. Report the error and switch the encoding 9677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to ISO-Latin-1 (if you don't like this policy, just declare the 9678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * encoding !) 9679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *len = 0; 9681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR0(XPATH_ENCODING_ERROR); 9682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathParseNCName: 9686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an XML namespace non qualified name. 9689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [NS 3] NCName ::= (Letter | '_') (NCNameChar)* 9691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [NS 4] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | 9693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * CombiningChar | Extender 9694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the namespace name or NULL 9696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar * 9699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathParseNCName(xmlXPathParserContextPtr ctxt) { 9700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *in; 9701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret; 9702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int count = 0; 9703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->cur == NULL)) return(NULL); 9705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Accelerator for simple ASCII names 9707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in = ctxt->cur; 9709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((*in >= 0x61) && (*in <= 0x7A)) || 9710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((*in >= 0x41) && (*in <= 0x5A)) || 9711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*in == '_')) { 9712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in++; 9713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (((*in >= 0x61) && (*in <= 0x7A)) || 9714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((*in >= 0x41) && (*in <= 0x5A)) || 9715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((*in >= 0x30) && (*in <= 0x39)) || 9716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*in == '_') || (*in == '.') || 9717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*in == '-')) 9718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in++; 9719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*in == ' ') || (*in == '>') || (*in == '/') || 9720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*in == '[') || (*in == ']') || (*in == ':') || 9721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*in == '@') || (*in == '*')) { 9722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project count = in - ctxt->cur; 9723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (count == 0) 9724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 9725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrndup(ctxt->cur, count); 9726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->cur = in; 9727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 9728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathParseNameComplex(ctxt, 0)); 9731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathParseQName: 9736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prefix: a xmlChar ** 9738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an XML qualified name 9740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [NS 5] QName ::= (Prefix ':')? LocalPart 9742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [NS 6] Prefix ::= NCName 9744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [NS 7] LocalPart ::= NCName 9746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the function returns the local part, and prefix is updated 9748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to get the Prefix if any. 9749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 9752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathParseQName(xmlXPathParserContextPtr ctxt, xmlChar **prefix) { 9753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret = NULL; 9754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *prefix = NULL; 9756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathParseNCName(ctxt); 9757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == ':') { 9758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *prefix = ret; 9759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 9760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathParseNCName(ctxt); 9761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 9763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathParseName: 9767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse an XML name 9770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | 9772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * CombiningChar | Extender 9773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [5] Name ::= (Letter | '_' | ':') (NameChar)* 9775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the namespace name or NULL 9777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar * 9780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathParseName(xmlXPathParserContextPtr ctxt) { 9781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *in; 9782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret; 9783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int count = 0; 9784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->cur == NULL)) return(NULL); 9786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Accelerator for simple ASCII names 9788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in = ctxt->cur; 9790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((*in >= 0x61) && (*in <= 0x7A)) || 9791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((*in >= 0x41) && (*in <= 0x5A)) || 9792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*in == '_') || (*in == ':')) { 9793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in++; 9794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (((*in >= 0x61) && (*in <= 0x7A)) || 9795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((*in >= 0x41) && (*in <= 0x5A)) || 9796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((*in >= 0x30) && (*in <= 0x39)) || 9797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*in == '_') || (*in == '-') || 9798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*in == ':') || (*in == '.')) 9799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project in++; 9800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*in > 0) && (*in < 0x80)) { 9801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project count = in - ctxt->cur; 9802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrndup(ctxt->cur, count); 9803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->cur = in; 9804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 9805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathParseNameComplex(ctxt, 1)); 9808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 9811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathParseNameComplex(xmlXPathParserContextPtr ctxt, int qualified) { 9812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar buf[XML_MAX_NAMELEN + 5]; 9813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len = 0, l; 9814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int c; 9815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handler for more complex cases 9818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = CUR_CHAR(l); 9820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ 9821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (c == '[') || (c == ']') || (c == '@') || /* accelerators */ 9822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (c == '*') || /* accelerators */ 9823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!IS_LETTER(c) && (c != '_') && 9824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((qualified) && (c != ':')))) { 9825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 9826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ 9829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((IS_LETTER(c)) || (IS_DIGIT(c)) || 9830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (c == '.') || (c == '-') || 9831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (c == '_') || ((qualified) && (c == ':')) || 9832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (IS_COMBINING(c)) || 9833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (IS_EXTENDER(c)))) { 9834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project COPY_BUF(l,buf,len,c); 9835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXTL(l); 9836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = CUR_CHAR(l); 9837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (len >= XML_MAX_NAMELEN) { 9838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Okay someone managed to make a huge name, so he's ready to pay 9840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for the processing speed. 9841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *buffer; 9843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int max = len * 2; 9844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buffer = (xmlChar *) xmlMallocAtomic(max * sizeof(xmlChar)); 9846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buffer == NULL) { 9847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERRORNULL(XPATH_MEMORY_ERROR); 9848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(buffer, buf, len); 9850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((IS_LETTER(c)) || (IS_DIGIT(c)) || /* test bigname.xml */ 9851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (c == '.') || (c == '-') || 9852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (c == '_') || ((qualified) && (c == ':')) || 9853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (IS_COMBINING(c)) || 9854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (IS_EXTENDER(c))) { 9855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (len + 10 > max) { 9856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max *= 2; 9857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buffer = (xmlChar *) xmlRealloc(buffer, 9858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max * sizeof(xmlChar)); 9859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buffer == NULL) { 9860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERRORNULL(XPATH_MEMORY_ERROR); 9861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project COPY_BUF(l,buffer,len,c); 9864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXTL(l); 9865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = CUR_CHAR(l); 9866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buffer[len] = 0; 9868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(buffer); 9869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (len == 0) 9872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 9873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlStrndup(buf, len)); 9874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAX_FRAC 20 9877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 9879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * These are used as divisors for the fractional part of a number. 9880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Since the table includes 1.0 (representing '0' fractional digits), 9881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it must be dimensioned at MAX_FRAC+1 (bug 133921) 9882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic double my_pow10[MAX_FRAC+1] = { 9884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1.0, 10.0, 100.0, 1000.0, 10000.0, 9885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 100000.0, 1000000.0, 10000000.0, 100000000.0, 1000000000.0, 9886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10000000000.0, 100000000000.0, 1000000000000.0, 10000000000000.0, 9887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 100000000000000.0, 9888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1000000000000000.0, 10000000000000000.0, 100000000000000000.0, 9889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1000000000000000000.0, 10000000000000000000.0, 100000000000000000000.0 9890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 9891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathStringEvalNumber: 9894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: A string to scan 9895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [30a] Float ::= Number ('e' Digits?)? 9897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [30] Number ::= Digits ('.' Digits?)? 9899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | '.' Digits 9900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [31] Digits ::= [0-9]+ 9901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a Number in the string 9903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In complement of the Number expression, this function also handles 9904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * negative values : '-' Number. 9905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the double value. 9907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdouble 9909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathStringEvalNumber(const xmlChar *str) { 9910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *cur = str; 9911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double ret; 9912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ok = 0; 9913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int isneg = 0; 9914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int exponent = 0; 9915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int is_exponent_negative = 0; 9916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef __GNUC__ 9917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned long tmp = 0; 9918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double temp; 9919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 9920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) return(0); 9921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*cur)) cur++; 9922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*cur != '.') && ((*cur < '0') || (*cur > '9')) && (*cur != '-')) { 9923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNAN); 9924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*cur == '-') { 9926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project isneg = 1; 9927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 9928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef __GNUC__ 9931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 9932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * tmp/temp is a workaround against a gcc compiler bug 9933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://veillard.com/gcc.bug 9934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 9936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur >= '0') && (*cur <= '9')) { 9937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ret * 10; 9938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (*cur - '0'); 9939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ok = 1; 9940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 9941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project temp = (double) tmp; 9942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ret + temp; 9943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 9945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 9946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur >= '0') && (*cur <= '9')) { 9947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ret * 10 + (*cur - '0'); 9948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ok = 1; 9949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 9950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 9952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*cur == '.') { 9954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int v, frac = 0; 9955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double fraction = 0; 9956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 9958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((*cur < '0') || (*cur > '9')) && (!ok)) { 9959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathNAN); 9960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (((*cur >= '0') && (*cur <= '9')) && (frac < MAX_FRAC)) { 9962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project v = (*cur - '0'); 9963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fraction = fraction * 10 + v; 9964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project frac = frac + 1; 9965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 9966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fraction /= my_pow10[frac]; 9968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ret + fraction; 9969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur >= '0') && (*cur <= '9')) 9970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 9971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*cur == 'e') || (*cur == 'E')) { 9973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 9974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*cur == '-') { 9975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_exponent_negative = 1; 9976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 9977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (*cur == '+') { 9978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 9979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur >= '0') && (*cur <= '9')) { 9981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exponent = exponent * 10 + (*cur - '0'); 9982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 9983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 9985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(*cur)) cur++; 9986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*cur != 0) return(xmlXPathNAN); 9987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (isneg) ret = -ret; 9988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (is_exponent_negative) exponent = -exponent; 9989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret *= pow(10.0, (double)exponent); 9990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 9991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 9992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 9994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompNumber: 9995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 9996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [30] Number ::= Digits ('.' Digits?)? 9998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | '.' Digits 9999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [31] Digits ::= [0-9]+ 10000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a Number, then push it on the stack 10002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompNumber(xmlXPathParserContextPtr ctxt) 10006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 10007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double ret = 0.0; 10008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double mult = 1; 10009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ok = 0; 10010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int exponent = 0; 10011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int is_exponent_negative = 0; 10012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef __GNUC__ 10013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned long tmp = 0; 10014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project double temp; 10015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR != '.') && ((CUR < '0') || (CUR > '9'))) { 10019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_NUMBER_ERROR); 10020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef __GNUC__ 10022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * tmp/temp is a workaround against a gcc compiler bug 10024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://veillard.com/gcc.bug 10025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 10027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR >= '0') && (CUR <= '9')) { 10028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ret * 10; 10029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (CUR - '0'); 10030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ok = 1; 10031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project temp = (double) tmp; 10033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ret + temp; 10034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 10036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 0; 10037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR >= '0') && (CUR <= '9')) { 10038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ret * 10 + (CUR - '0'); 10039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ok = 1; 10040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '.') { 10044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((CUR < '0') || (CUR > '9')) && (!ok)) { 10046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_NUMBER_ERROR); 10047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR >= '0') && (CUR <= '9')) { 10049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mult /= 10; 10050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ret + (CUR - '0') * mult; 10051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR == 'e') || (CUR == 'E')) { 10055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '-') { 10057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project is_exponent_negative = 1; 10058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '+') { 10060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR >= '0') && (CUR <= '9')) { 10063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exponent = exponent * 10 + (CUR - '0'); 10064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (is_exponent_negative) 10067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exponent = -exponent; 10068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret *= pow(10.0, (double) exponent); 10069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_LONG_EXPR(XPATH_OP_VALUE, XPATH_NUMBER, 0, 0, 10071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheNewFloat(ctxt->context, ret), NULL); 10072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathParseLiteral: 10076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse a Literal 10079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [29] Literal ::= '"' [^"]* '"' 10081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | "'" [^']* "'" 10082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the value found or NULL in case of error 10084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 10086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathParseLiteral(xmlXPathParserContextPtr ctxt) { 10087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *q; 10088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret = NULL; 10089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '"') { 10091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project q = CUR_PTR; 10093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((IS_CHAR_CH(CUR)) && (CUR != '"')) 10094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_CHAR_CH(CUR)) { 10096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERRORNULL(XPATH_UNFINISHED_LITERAL_ERROR); 10097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrndup(q, CUR_PTR - q); 10099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '\'') { 10102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project q = CUR_PTR; 10104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((IS_CHAR_CH(CUR)) && (CUR != '\'')) 10105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_CHAR_CH(CUR)) { 10107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERRORNULL(XPATH_UNFINISHED_LITERAL_ERROR); 10108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrndup(q, CUR_PTR - q); 10110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERRORNULL(XPATH_START_LITERAL_ERROR); 10114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 10116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompLiteral: 10120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse a Literal and push it on the stack. 10123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [29] Literal ::= '"' [^"]* '"' 10125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | "'" [^']* "'" 10126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: xmlXPathCompLiteral memory allocation could be improved. 10128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompLiteral(xmlXPathParserContextPtr ctxt) { 10131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *q; 10132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret = NULL; 10133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '"') { 10135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project q = CUR_PTR; 10137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((IS_CHAR_CH(CUR)) && (CUR != '"')) 10138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_CHAR_CH(CUR)) { 10140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_UNFINISHED_LITERAL_ERROR); 10141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrndup(q, CUR_PTR - q); 10143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '\'') { 10146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project q = CUR_PTR; 10148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((IS_CHAR_CH(CUR)) && (CUR != '\'')) 10149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_CHAR_CH(CUR)) { 10151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_UNFINISHED_LITERAL_ERROR); 10152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrndup(q, CUR_PTR - q); 10154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_START_LITERAL_ERROR); 10158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) return; 10160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_LONG_EXPR(XPATH_OP_VALUE, XPATH_STRING, 0, 0, 10161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheNewString(ctxt->context, ret), NULL); 10162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ret); 10163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompVariableReference: 10167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse a VariableReference, evaluate it and push it on the stack. 10170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The variable bindings consist of a mapping from variable names 10172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to variable values. The value of a variable is an object, which can be 10173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of any of the types that are possible for the value of an expression, 10174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and may also be of additional types not specified here. 10175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Early evaluation is possible since: 10177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The variable bindings [...] used to evaluate a subexpression are 10178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * always the same as those used to evaluate the containing expression. 10179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [36] VariableReference ::= '$' QName 10181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompVariableReference(xmlXPathParserContextPtr ctxt) { 10184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name; 10185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *prefix; 10186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '$') { 10189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_VARIABLE_REF_ERROR); 10190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlXPathParseQName(ctxt, &prefix); 10193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 10194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_VARIABLE_REF_ERROR); 10195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->comp->last = -1; 10197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_LONG_EXPR(XPATH_OP_VARIABLE, 0, 0, 0, 10198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, prefix); 10199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->context != NULL) && (ctxt->context->flags & XML_XPATH_NOVAR)) { 10201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_UNDEF_VARIABLE_ERROR); 10202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIsNodeType: 10207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: a name string 10208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Is the name given a NodeType one. 10210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [38] NodeType ::= 'comment' 10212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'text' 10213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'processing-instruction' 10214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'node' 10215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if true 0 otherwise 10217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 10219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIsNodeType(const xmlChar *name) { 10220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) 10221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 10222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "node")) 10224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 10225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "text")) 10226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 10227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "comment")) 10228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 10229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "processing-instruction")) 10230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 10231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 10232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompFunctionCall: 10236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [16] FunctionCall ::= FunctionName '(' ( Argument ( ',' Argument)*)? ')' 10239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [17] Argument ::= Expr 10240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a function call, the evaluation of all arguments are 10242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * pushed on the stack 10243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompFunctionCall(xmlXPathParserContextPtr ctxt) { 10246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name; 10247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *prefix; 10248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbargs = 0; 10249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int sort = 1; 10250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlXPathParseQName(ctxt, &prefix); 10252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 10253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_EXPR_ERROR); 10254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EXPR 10257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix == NULL) 10258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Calling function %s\n", 10259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name); 10260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 10261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Calling function %s:%s\n", 10262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prefix, name); 10263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '(') { 10266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_EXPR_ERROR); 10267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Optimization for count(): we don't need the node-set to be sorted. 10273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((prefix == NULL) && (name[0] == 'c') && 10275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStrEqual(name, BAD_CAST "count")) 10276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 10277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sort = 0; 10278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->comp->last = -1; 10280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != ')') { 10281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (CUR != 0) { 10282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int op1 = ctxt->comp->last; 10283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->comp->last = -1; 10284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompileExpr(ctxt, sort); 10285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_BINARY_EXPR(XPATH_OP_ARG, op1, ctxt->comp->last, 0, 0); 10287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbargs++; 10288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == ')') break; 10289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != ',') { 10290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_EXPR_ERROR); 10291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_LONG_EXPR(XPATH_OP_FUNCTION, nbargs, 0, 0, 10297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name, prefix); 10298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompPrimaryExpr: 10304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [15] PrimaryExpr ::= VariableReference 10307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | '(' Expr ')' 10308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | Literal 10309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | Number 10310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | FunctionCall 10311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a primary expression. 10313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompPrimaryExpr(xmlXPathParserContextPtr ctxt) { 10316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '$') xmlXPathCompVariableReference(ctxt); 10318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (CUR == '(') { 10319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompileExpr(ctxt, 1); 10322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != ')') { 10324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_EXPR_ERROR); 10325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_ASCII_DIGIT(CUR) || (CUR == '.' && IS_ASCII_DIGIT(NXT(1)))) { 10329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompNumber(ctxt); 10330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((CUR == '\'') || (CUR == '"')) { 10331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompLiteral(ctxt); 10332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompFunctionCall(ctxt); 10334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompFilterExpr: 10340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [20] FilterExpr ::= PrimaryExpr 10343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | FilterExpr Predicate 10344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a filter expression. 10346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Square brackets are used to filter expressions in the same way that 10347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * they are used in location paths. It is an error if the expression to 10348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be filtered does not evaluate to a node-set. The context node list 10349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * used for evaluating the expression in square brackets is the node-set 10350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to be filtered listed in document order. 10351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompFilterExpr(xmlXPathParserContextPtr ctxt) { 10355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompPrimaryExpr(ctxt); 10356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (CUR == '[') { 10360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompPredicate(ctxt, 1); 10361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathScanName: 10369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Trickery: parse an XML name but without consuming the input flow 10372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Needed to avoid insanity in the parser state. 10373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | 10375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * CombiningChar | Extender 10376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [5] Name ::= (Letter | '_' | ':') (NameChar)* 10378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [6] Names ::= Name (S Name)* 10380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the Name parsed or NULL 10382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 10385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathScanName(xmlXPathParserContextPtr ctxt) { 10386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len = 0, l; 10387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int c; 10388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *cur; 10389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret; 10390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->cur; 10392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = CUR_CHAR(l); 10394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ 10395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!IS_LETTER(c) && (c != '_') && 10396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (c != ':'))) { 10397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 10398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ 10401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((IS_LETTER(c)) || (IS_DIGIT(c)) || 10402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (c == '.') || (c == '-') || 10403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (c == '_') || (c == ':') || 10404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (IS_COMBINING(c)) || 10405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (IS_EXTENDER(c)))) { 10406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len += l; 10407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXTL(l); 10408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = CUR_CHAR(l); 10409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrndup(cur, ctxt->cur - cur); 10411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->cur = cur; 10412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 10413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompPathExpr: 10417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [19] PathExpr ::= LocationPath 10420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | FilterExpr 10421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | FilterExpr '/' RelativeLocationPath 10422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | FilterExpr '//' RelativeLocationPath 10423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a path expression. 10425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The / operator and // operators combine an arbitrary expression 10426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and a relative location path. It is an error if the expression 10427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * does not evaluate to a node-set. 10428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The / operator does composition in the same way as when / is 10429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * used in a location path. As in location paths, // is short for 10430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * /descendant-or-self::node()/. 10431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompPathExpr(xmlXPathParserContextPtr ctxt) { 10435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int lc = 1; /* Should we branch to LocationPath ? */ 10436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name = NULL; /* we may have to preparse a name to find out */ 10437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR == '$') || (CUR == '(') || 10440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (IS_ASCII_DIGIT(CUR)) || 10441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (CUR == '\'') || (CUR == '"') || 10442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (CUR == '.' && IS_ASCII_DIGIT(NXT(1)))) { 10443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 0; 10444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '*') { 10445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* relative or absolute location path */ 10446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 1; 10447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '/') { 10448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* relative or absolute location path */ 10449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 1; 10450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '@') { 10451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* relative abbreviated attribute location path */ 10452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 1; 10453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '.') { 10454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* relative abbreviated attribute location path */ 10455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 1; 10456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Problem is finding if we have a name here whether it's: 10459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - a nodetype 10460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - a function call in which case it's followed by '(' 10461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - an axis in which case it's followed by ':' 10462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - a element name 10463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We do an a priori analysis here rather than having to 10464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * maintain parsed token content through the recursive function 10465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * calls. This looks uglier but makes the code easier to 10466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * read/write/debug. 10467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlXPathScanName(ctxt); 10470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((name != NULL) && (xmlStrstr(name, (xmlChar *) "::") != NULL)) { 10471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 10472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 10473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "PathExpr: Axis\n"); 10474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 1; 10476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name); 10477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (name != NULL) { 10478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len =xmlStrlen(name); 10479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (NXT(len) != 0) { 10482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (NXT(len) == '/') { 10483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* element name */ 10484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 10485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 10486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "PathExpr: AbbrRelLocation\n"); 10487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 1; 10489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_BLANK_CH(NXT(len))) { 10491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* ignore blanks */ 10492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ; 10493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (NXT(len) == ':') { 10494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 10495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 10496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "PathExpr: AbbrRelLocation\n"); 10497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 1; 10499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((NXT(len) == '(')) { 10501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Note Type or Function */ 10502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsNodeType(name)) { 10503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 10504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 10505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "PathExpr: Type search\n"); 10506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 1; 10508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 10510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 10511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "PathExpr: function call\n"); 10512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 0; 10514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((NXT(len) == '[')) { 10517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* element name */ 10518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 10519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 10520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "PathExpr: AbbrRelLocation\n"); 10521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 1; 10523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((NXT(len) == '<') || (NXT(len) == '>') || 10525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (NXT(len) == '=')) { 10526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 1; 10527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 1; 10530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 10531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len++; 10533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (NXT(len) == 0) { 10535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 10536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 10537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "PathExpr: AbbrRelLocation\n"); 10538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 10539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* element name */ 10540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lc = 1; 10541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name); 10543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* make sure all cases are covered explicitly */ 10545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_EXPR_ERROR); 10546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lc) { 10550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '/') { 10551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_LEAVE_EXPR(XPATH_OP_ROOT, 0, 0); 10552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_LEAVE_EXPR(XPATH_OP_NODE, 0, 0); 10554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompLocationPath(ctxt); 10556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 10557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompFilterExpr(ctxt); 10558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR == '/') && (NXT(1) == '/')) { 10560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(2); 10561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF, 10564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL); 10565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_UNARY_EXPR(XPATH_OP_RESET, ctxt->comp->last, 1, 0); 10566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompRelativeLocationPath(ctxt); 10568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '/') { 10569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompRelativeLocationPath(ctxt); 10570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompUnionExpr: 10577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [18] UnionExpr ::= PathExpr 10580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | UnionExpr '|' PathExpr 10581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an union expression. 10583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompUnionExpr(xmlXPathParserContextPtr ctxt) { 10587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompPathExpr(ctxt); 10588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (CUR == '|') { 10591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int op1 = ctxt->comp->last; 10592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_LEAVE_EXPR(XPATH_OP_NODE, 0, 0); 10593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompPathExpr(ctxt); 10597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_BINARY_EXPR(XPATH_OP_UNION, op1, ctxt->comp->last, 0, 0); 10599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompUnaryExpr: 10606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [27] UnaryExpr ::= UnionExpr 10609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | '-' UnaryExpr 10610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an unary expression. 10612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompUnaryExpr(xmlXPathParserContextPtr ctxt) { 10616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int minus = 0; 10617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int found = 0; 10618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (CUR == '-') { 10621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project minus = 1 - minus; 10622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project found = 1; 10623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompUnionExpr(ctxt); 10628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (found) { 10630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (minus) 10631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_UNARY_EXPR(XPATH_OP_PLUS, ctxt->comp->last, 2, 0); 10632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 10633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_UNARY_EXPR(XPATH_OP_PLUS, ctxt->comp->last, 3, 0); 10634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompMultiplicativeExpr: 10639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [26] MultiplicativeExpr ::= UnaryExpr 10642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | MultiplicativeExpr MultiplyOperator UnaryExpr 10643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | MultiplicativeExpr 'div' UnaryExpr 10644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | MultiplicativeExpr 'mod' UnaryExpr 10645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [34] MultiplyOperator ::= '*' 10646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an Additive expression. 10648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompMultiplicativeExpr(xmlXPathParserContextPtr ctxt) { 10652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompUnaryExpr(ctxt); 10653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR == '*') || 10656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((CUR == 'd') && (NXT(1) == 'i') && (NXT(2) == 'v')) || 10657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((CUR == 'm') && (NXT(1) == 'o') && (NXT(2) == 'd'))) { 10658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int op = -1; 10659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int op1 = ctxt->comp->last; 10660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '*') { 10662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op = 0; 10663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == 'd') { 10665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op = 1; 10666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(3); 10667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == 'm') { 10668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op = 2; 10669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(3); 10670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompUnaryExpr(ctxt); 10673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_BINARY_EXPR(XPATH_OP_MULT, op1, ctxt->comp->last, op, 0); 10675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompAdditiveExpr: 10681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [25] AdditiveExpr ::= MultiplicativeExpr 10684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | AdditiveExpr '+' MultiplicativeExpr 10685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | AdditiveExpr '-' MultiplicativeExpr 10686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an Additive expression. 10688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompAdditiveExpr(xmlXPathParserContextPtr ctxt) { 10692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompMultiplicativeExpr(ctxt); 10694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR == '+') || (CUR == '-')) { 10697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int plus; 10698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int op1 = ctxt->comp->last; 10699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '+') plus = 1; 10701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else plus = 0; 10702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompMultiplicativeExpr(ctxt); 10705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_BINARY_EXPR(XPATH_OP_PLUS, op1, ctxt->comp->last, plus, 0); 10707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompRelationalExpr: 10713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [24] RelationalExpr ::= AdditiveExpr 10716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | RelationalExpr '<' AdditiveExpr 10717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | RelationalExpr '>' AdditiveExpr 10718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | RelationalExpr '<=' AdditiveExpr 10719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | RelationalExpr '>=' AdditiveExpr 10720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A <= B > C is allowed ? Answer from James, yes with 10722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (AdditiveExpr <= AdditiveExpr) > AdditiveExpr 10723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * which is basically what got implemented. 10724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a Relational expression, then push the result 10726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * on the stack 10727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompRelationalExpr(xmlXPathParserContextPtr ctxt) { 10731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompAdditiveExpr(ctxt); 10732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR == '<') || 10735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (CUR == '>') || 10736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((CUR == '<') && (NXT(1) == '=')) || 10737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((CUR == '>') && (NXT(1) == '='))) { 10738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int inf, strict; 10739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int op1 = ctxt->comp->last; 10740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '<') inf = 1; 10742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else inf = 0; 10743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (NXT(1) == '=') strict = 0; 10744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else strict = 1; 10745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!strict) NEXT; 10747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompAdditiveExpr(ctxt); 10749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_BINARY_EXPR(XPATH_OP_CMP, op1, ctxt->comp->last, inf, strict); 10751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompEqualityExpr: 10757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [23] EqualityExpr ::= RelationalExpr 10760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | EqualityExpr '=' RelationalExpr 10761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | EqualityExpr '!=' RelationalExpr 10762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A != B != C is allowed ? Answer from James, yes with 10764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (RelationalExpr = RelationalExpr) = RelationalExpr 10765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (RelationalExpr != RelationalExpr) != RelationalExpr 10766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * which is basically what got implemented. 10767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an Equality expression. 10769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompEqualityExpr(xmlXPathParserContextPtr ctxt) { 10773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompRelationalExpr(ctxt); 10774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR == '=') || ((CUR == '!') && (NXT(1) == '='))) { 10777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int eq; 10778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int op1 = ctxt->comp->last; 10779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '=') eq = 1; 10781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else eq = 0; 10782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!eq) NEXT; 10784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompRelationalExpr(ctxt); 10786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_BINARY_EXPR(XPATH_OP_EQUAL, op1, ctxt->comp->last, eq, 0); 10788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompAndExpr: 10794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [22] AndExpr ::= EqualityExpr 10797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | AndExpr 'and' EqualityExpr 10798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an AND expression. 10800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompAndExpr(xmlXPathParserContextPtr ctxt) { 10804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompEqualityExpr(ctxt); 10805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR == 'a') && (NXT(1) == 'n') && (NXT(2) == 'd')) { 10808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int op1 = ctxt->comp->last; 10809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(3); 10810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompEqualityExpr(ctxt); 10812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_BINARY_EXPR(XPATH_OP_AND, op1, ctxt->comp->last, 0, 0); 10814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompileExpr: 10820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [14] Expr ::= OrExpr 10823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [21] OrExpr ::= AndExpr 10824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | OrExpr 'or' AndExpr 10825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse and compile an expression 10827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompileExpr(xmlXPathParserContextPtr ctxt, int sort) { 10830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompAndExpr(ctxt); 10831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((CUR == 'o') && (NXT(1) == 'r')) { 10834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int op1 = ctxt->comp->last; 10835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(2); 10836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompAndExpr(ctxt); 10838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_BINARY_EXPR(XPATH_OP_OR, op1, ctxt->comp->last, 0, 0); 10840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op1 = ctxt->comp->nbStep; 10841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((sort) && (ctxt->comp->steps[ctxt->comp->last].op != XPATH_OP_VALUE)) { 10844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* more ops could be optimized too */ 10845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is the main place to eliminate sorting for 10847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * operations which don't require a sorted node-set. 10848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * E.g. count(). 10849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_UNARY_EXPR(XPATH_OP_SORT, ctxt->comp->last , 0, 0); 10851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompPredicate: 10856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filter: act as a filter 10858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [8] Predicate ::= '[' PredicateExpr ']' 10860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [9] PredicateExpr ::= Expr 10861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a predicate expression 10863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 10865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompPredicate(xmlXPathParserContextPtr ctxt, int filter) { 10866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int op1 = ctxt->comp->last; 10867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '[') { 10870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_PREDICATE_ERROR); 10871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->comp->last = -1; 10876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This call to xmlXPathCompileExpr() will deactivate sorting 10878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the predicate result. 10879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: Sorting is still activated for filters, since I'm not 10880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * sure if needed. Normally sorting should not be needed, since 10881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a filter can only diminish the number of items in a sequence, 10882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * but won't change its order; so if the initial sequence is sorted, 10883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * subsequent sorting is not needed. 10884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! filter) 10886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompileExpr(ctxt, 0); 10887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 10888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompileExpr(ctxt, 1); 10889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 10890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != ']') { 10892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_INVALID_PREDICATE_ERROR); 10893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (filter) 10896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_BINARY_EXPR(XPATH_OP_FILTER, op1, ctxt->comp->last, 0, 0); 10897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 10898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_BINARY_EXPR(XPATH_OP_PREDICATE, op1, ctxt->comp->last, 0, 0); 10899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 10903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 10905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompNodeTest: 10906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 10907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @test: pointer to a xmlXPathTestVal 10908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: pointer to a xmlXPathTypeVal 10909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prefix: placeholder for a possible name prefix 10910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [7] NodeTest ::= NameTest 10912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | NodeType '(' ')' 10913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'processing-instruction' '(' Literal ')' 10914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [37] NameTest ::= '*' 10916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | NCName ':' '*' 10917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | QName 10918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [38] NodeType ::= 'comment' 10919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'text' 10920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'processing-instruction' 10921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'node' 10922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 10923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the name found and updates @test, @type and @prefix appropriately 10924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 10926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompNodeTest(xmlXPathParserContextPtr ctxt, xmlXPathTestVal *test, 10927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathTypeVal *type, const xmlChar **prefix, 10928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name) { 10929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int blanks; 10930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((test == NULL) || (type == NULL) || (prefix == NULL)) { 10932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project STRANGE; 10933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 10934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *type = (xmlXPathTypeVal) 0; 10936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *test = (xmlXPathTestVal) 0; 10937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *prefix = NULL; 10938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((name == NULL) && (CUR == '*')) { 10941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * All elements 10943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *test = NODE_TEST_ALL; 10946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 10947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) 10950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlXPathParseNCName(ctxt); 10951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 10952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERRORNULL(XPATH_EXPR_ERROR); 10953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project blanks = IS_BLANK_CH(CUR); 10956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '(') { 10958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NodeType or PI search 10961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "comment")) 10963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *type = NODE_TYPE_COMMENT; 10964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (xmlStrEqual(name, BAD_CAST "node")) 10965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *type = NODE_TYPE_NODE; 10966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (xmlStrEqual(name, BAD_CAST "processing-instruction")) 10967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *type = NODE_TYPE_PI; 10968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (xmlStrEqual(name, BAD_CAST "text")) 10969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *type = NODE_TYPE_TEXT; 10970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 10971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) 10972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name); 10973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERRORNULL(XPATH_EXPR_ERROR); 10974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *test = NODE_TEST_TYPE; 10977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*type == NODE_TYPE_PI) { 10980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 10981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Specific case: search a PI by name. 10982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 10983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) 10984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name); 10985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = NULL; 10986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != ')') { 10987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlXPathParseLiteral(ctxt); 10988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR NULL; 10989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *test = NODE_TEST_PI; 10990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 10991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != ')') { 10994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) 10995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name); 10996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERRORNULL(XPATH_UNCLOSED_ERROR); 10997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 10998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 10999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(name); 11000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *test = NODE_TEST_NAME; 11002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!blanks) && (CUR == ':')) { 11003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 11004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Since currently the parser context don't have a 11007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * namespace list associated: 11008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The namespace name for this prefix can be computed 11009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * only at evaluation time. The compilation is done 11010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * outside of any context. 11011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 11013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *prefix = xmlXPathNsLookup(ctxt->context, name); 11014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) 11015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name); 11016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*prefix == NULL) { 11017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR0(XPATH_UNDEF_PREFIX_ERROR); 11018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 11020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *prefix = name; 11021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 11022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '*') { 11024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * All elements 11026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 11028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *test = NODE_TEST_ALL; 11029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 11030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlXPathParseNCName(ctxt); 11033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 11034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERRORNULL(XPATH_EXPR_ERROR); 11035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(name); 11038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 11039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 11041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathIsAxisName: 11042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: a preparsed name token 11043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [6] AxisName ::= 'ancestor' 11045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'ancestor-or-self' 11046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'attribute' 11047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'child' 11048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'descendant' 11049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'descendant-or-self' 11050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'following' 11051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'following-sibling' 11052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'namespace' 11053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'parent' 11054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'preceding' 11055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'preceding-sibling' 11056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'self' 11057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the axis or 0 11059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathAxisVal 11061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIsAxisName(const xmlChar *name) { 11062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathAxisVal ret = (xmlXPathAxisVal) 0; 11063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (name[0]) { 11064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'a': 11065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "ancestor")) 11066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_ANCESTOR; 11067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "ancestor-or-self")) 11068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_ANCESTOR_OR_SELF; 11069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "attribute")) 11070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_ATTRIBUTE; 11071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'c': 11073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "child")) 11074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_CHILD; 11075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'd': 11077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "descendant")) 11078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_DESCENDANT; 11079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "descendant-or-self")) 11080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_DESCENDANT_OR_SELF; 11081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'f': 11083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "following")) 11084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_FOLLOWING; 11085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "following-sibling")) 11086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_FOLLOWING_SIBLING; 11087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'n': 11089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "namespace")) 11090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_NAMESPACE; 11091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'p': 11093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "parent")) 11094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_PARENT; 11095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "preceding")) 11096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_PRECEDING; 11097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "preceding-sibling")) 11098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_PRECEDING_SIBLING; 11099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 's': 11101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "self")) 11102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = AXIS_SELF; 11103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 11106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 11107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 11109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompStep: 11110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 11111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [4] Step ::= AxisSpecifier NodeTest Predicate* 11113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | AbbreviatedStep 11114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [12] AbbreviatedStep ::= '.' | '..' 11116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [5] AxisSpecifier ::= AxisName '::' 11118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | AbbreviatedAxisSpecifier 11119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [13] AbbreviatedAxisSpecifier ::= '@'? 11121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Modified for XPtr range support as: 11123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [4xptr] Step ::= AxisSpecifier NodeTest Predicate* 11125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | AbbreviatedStep 11126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | 'range-to' '(' Expr ')' Predicate* 11127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile one step in a Location Path 11129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A location step of . is short for self::node(). This is 11130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * particularly useful in conjunction with //. For example, the 11131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * location path .//para is short for 11132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * self::node()/descendant-or-self::node()/child::para 11133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and so will select all para descendant elements of the context 11134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node. 11135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Similarly, a location step of .. is short for parent::node(). 11136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * For example, ../title is short for parent::node()/child::title 11137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and so will select the title children of the parent of the context 11138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node. 11139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 11141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompStep(xmlXPathParserContextPtr ctxt) { 11142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 11143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int rangeto = 0; 11144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int op2 = -1; 11145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 11146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR == '.') && (NXT(1) == '.')) { 11149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(2); 11150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_PARENT, 11152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL); 11153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '.') { 11154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 11155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 11157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name = NULL; 11158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *prefix = NULL; 11159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathTestVal test = (xmlXPathTestVal) 0; 11160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathAxisVal axis = (xmlXPathAxisVal) 0; 11161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathTypeVal type = (xmlXPathTypeVal) 0; 11162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int op1; 11163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The modification needed for XPointer change to the production 11166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 11168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->xptr) { 11169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlXPathParseNCName(ctxt); 11170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((name != NULL) && (xmlStrEqual(name, BAD_CAST "range-to"))) { 11171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op2 = ctxt->comp->last; 11172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name); 11173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '(') { 11175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_EXPR_ERROR); 11176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 11178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompileExpr(ctxt, 1); 11181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* PUSH_BINARY_EXPR(XPATH_OP_RANGETO, op2, ctxt->comp->last, 0, 0); */ 11182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 11183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != ')') { 11186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR(XPATH_EXPR_ERROR); 11187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 11189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rangeto = 1; 11190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto eval_predicates; 11191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 11194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '*') { 11195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project axis = AXIS_CHILD; 11196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 11197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) 11198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlXPathParseNCName(ctxt); 11199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) { 11200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project axis = xmlXPathIsAxisName(name); 11201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (axis != 0) { 11202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR == ':') && (NXT(1) == ':')) { 11204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(2); 11205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(name); 11206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = NULL; 11207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 11208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* an element name can conflict with an axis one :-\ */ 11209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project axis = AXIS_CHILD; 11210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 11212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project axis = AXIS_CHILD; 11213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '@') { 11215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 11216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project axis = AXIS_ATTRIBUTE; 11217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 11218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project axis = AXIS_CHILD; 11219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 11223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlXPathCompNodeTest(ctxt, &test, &type, &prefix, name); 11225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (test == 0) 11226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 11227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((prefix != NULL) && (ctxt->context != NULL) && 11229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->context->flags & XML_XPATH_CHECKNS)) { 11230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathNsLookup(ctxt->context, prefix) == NULL) { 11231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErr(ctxt, XPATH_UNDEF_PREFIX_ERROR); 11232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 11235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 11236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Basis : computing new set\n"); 11237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 11238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 11240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Basis : "); 11241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == NULL) 11242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "no value\n"); 11243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (ctxt->value->nodesetval == NULL) 11244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Empty\n"); 11245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 11246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericErrorContextNodeSet(stdout, ctxt->value->nodesetval); 11247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 11248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 11250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecteval_predicates: 11251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 11252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op1 = ctxt->comp->last; 11253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->comp->last = -1; 11254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (CUR == '[') { 11257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompPredicate(ctxt, 0); 11258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 11261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (rangeto) { 11262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_BINARY_EXPR(XPATH_OP_RANGETO, op2, op1, 0, 0); 11263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 11264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 11265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_FULL_EXPR(XPATH_OP_COLLECT, op1, ctxt->comp->last, axis, 11266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project test, type, (void *)prefix, (void *)name); 11267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 11270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Step : "); 11271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == NULL) 11272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "no value\n"); 11273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (ctxt->value->nodesetval == NULL) 11274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Empty\n"); 11275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 11276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericErrorContextNodeSet(xmlGenericErrorContext, 11277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->nodesetval); 11278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 11279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 11280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 11282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompRelativeLocationPath: 11283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 11284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [3] RelativeLocationPath ::= Step 11286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | RelativeLocationPath '/' Step 11287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | AbbreviatedRelativeLocationPath 11288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [11] AbbreviatedRelativeLocationPath ::= RelativeLocationPath '//' Step 11289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a relative location path. 11291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 11293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompRelativeLocationPath 11294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project(xmlXPathParserContextPtr ctxt) { 11295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR == '/') && (NXT(1) == '/')) { 11297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(2); 11298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF, 11300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL); 11301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '/') { 11302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 11303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompStep(ctxt); 11306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (CUR == '/') { 11308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR == '/') && (NXT(1) == '/')) { 11309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(2); 11310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF, 11312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL); 11313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompStep(ctxt); 11314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '/') { 11315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 11316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompStep(ctxt); 11318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 11322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 11324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompLocationPath: 11325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 11326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [1] LocationPath ::= RelativeLocationPath 11328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | AbsoluteLocationPath 11329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [2] AbsoluteLocationPath ::= '/' RelativeLocationPath? 11330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | AbbreviatedAbsoluteLocationPath 11331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [10] AbbreviatedAbsoluteLocationPath ::= 11332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * '//' RelativeLocationPath 11333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a location path 11335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * // is short for /descendant-or-self::node()/. For example, 11337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * //para is short for /descendant-or-self::node()/child::para and 11338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * so will select any para element in the document (even a para element 11339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * that is a document element will be selected by //para since the 11340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * document element node is a child of the root node); div//para is 11341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * short for div/descendant-or-self::node()/child::para and so will 11342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * select all para descendants of div children. 11343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 11345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompLocationPath(xmlXPathParserContextPtr ctxt) { 11346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '/') { 11348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompRelativeLocationPath(ctxt); 11349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 11350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (CUR == '/') { 11351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR == '/') && (NXT(1) == '/')) { 11352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP(2); 11353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF, 11355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL); 11356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompRelativeLocationPath(ctxt); 11357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '/') { 11358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 11359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 11360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR != 0 ) && 11361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((IS_ASCII_LETTER(CUR)) || (CUR == '_') || (CUR == '.') || 11362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (CUR == '@') || (CUR == '*'))) 11363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompRelativeLocationPath(ctxt); 11364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 11368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 11370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 11371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XPath precompiled expression evaluation * 11372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 11373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 11374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 11376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEval(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op); 11377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 11379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 11380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathDebugDumpStepAxis(xmlXPathAxisVal axis, 11381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathTestVal test, 11382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbNodes) 11383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 11384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "new step : "); 11385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (axis) { 11386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_ANCESTOR: 11387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "axis 'ancestors' "); 11388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_ANCESTOR_OR_SELF: 11390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 11391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "axis 'ancestors-or-self' "); 11392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_ATTRIBUTE: 11394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "axis 'attributes' "); 11395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_CHILD: 11397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "axis 'child' "); 11398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_DESCENDANT: 11400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "axis 'descendant' "); 11401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_DESCENDANT_OR_SELF: 11403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 11404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "axis 'descendant-or-self' "); 11405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_FOLLOWING: 11407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "axis 'following' "); 11408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_FOLLOWING_SIBLING: 11410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 11411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "axis 'following-siblings' "); 11412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_NAMESPACE: 11414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "axis 'namespace' "); 11415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_PARENT: 11417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "axis 'parent' "); 11418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_PRECEDING: 11420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "axis 'preceding' "); 11421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_PRECEDING_SIBLING: 11423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 11424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "axis 'preceding-sibling' "); 11425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_SELF: 11427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "axis 'self' "); 11428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 11431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project " context contains %d nodes\n", nbNodes); 11432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (test) { 11433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_NONE: 11434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 11435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project " searching for none !!!\n"); 11436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_TYPE: 11438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 11439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project " searching for type %d\n", type); 11440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_PI: 11442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 11443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project " searching for PI !!!\n"); 11444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_ALL: 11446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 11447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project " searching for *\n"); 11448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_NS: 11450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 11451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project " searching for namespace %s\n", 11452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prefix); 11453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_NAME: 11455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 11456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project " searching for name %s\n", name); 11457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix != NULL) 11458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 11459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project " with namespace %s\n", prefix); 11460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "Testing : "); 11463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 11464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* DEBUG_STEP */ 11465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 11467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalPredicate(xmlXPathParserContextPtr ctxt, 11468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr op, 11469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr set, 11470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int contextSize, 11471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int hasNsNodes) 11472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 11473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) { 11474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprPtr comp = ctxt->comp; 11475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Process inner predicates first. 11477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->steps[op->ch1].op != XPATH_OP_PREDICATE) { 11479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: raise an internal error. 11481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextSize = xmlXPathCompOpEvalPredicate(ctxt, 11484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[op->ch1], set, contextSize, hasNsNodes); 11485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 11486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextSize <= 0) 11487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 11488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) { 11490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextPtr xpctxt = ctxt->context; 11491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr contextNode, oldContextNode; 11492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr oldContextDoc; 11493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, res, contextPos = 0, newContextSize; 11494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr exprOp; 11495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr contextObj = NULL, exprRes = NULL; 11496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 11498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * URGENT TODO: Check the following: 11500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We don't expect location sets if evaluating prediates, right? 11501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Only filters should expect location sets, right? 11502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 11504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SPEC XPath 1.0: 11506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * "For each node in the node-set to be filtered, the 11507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * PredicateExpr is evaluated with that node as the 11508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context node, with the number of nodes in the 11509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set as the context size, and with the proximity 11510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * position of the node in the node-set with respect to 11511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the axis as the context position;" 11512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @oldset is the node-set" to be filtered. 11513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SPEC XPath 1.0: 11515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * "only predicates change the context position and 11516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context size (see [2.4 Predicates])." 11517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Example: 11518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set context pos 11519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nA 1 11520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nB 2 11521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nC 3 11522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * After applying predicate [position() > 1] : 11523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set context pos 11524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nB 1 11525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nC 2 11526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldContextNode = xpctxt->node; 11528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldContextDoc = xpctxt->doc; 11529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the expression of this predicate. 11531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exprOp = &ctxt->comp->steps[op->ch2]; 11533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newContextSize = 0; 11534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < set->nodeNr; i++) { 11535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set->nodeTab[i] == NULL) 11536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 11537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextNode = set->nodeTab[i]; 11539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->node = contextNode; 11540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->contextSize = contextSize; 11541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->proximityPosition = ++contextPos; 11542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Also set the xpath document in case things like 11545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * key() are evaluated in the predicate. 11546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((contextNode->type != XML_NAMESPACE_DECL) && 11548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (contextNode->doc != NULL)) 11549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->doc = contextNode->doc; 11550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the predicate expression with 1 context node 11552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * at a time; this node is packaged into a node set; this 11553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node set is handed over to the evaluation mechanism. 11554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextObj == NULL) 11556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextObj = xmlXPathCacheNewNodeSet(xpctxt, contextNode); 11557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 11558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique(contextObj->nodesetval, 11559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextNode); 11560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, contextObj); 11562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathCompOpEvalToBoolean(ctxt, exprOp, 1); 11564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->error != XPATH_EXPRESSION_OK) || (res == -1)) { 11566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetClear(set, hasNsNodes); 11567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newContextSize = 0; 11568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto evaluation_exit; 11569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != 0) { 11572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newContextSize++; 11573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 11574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Remove the entry from the initial node set. 11576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set->nodeTab[i] = NULL; 11578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextNode->type == XML_NAMESPACE_DECL) 11579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetFreeNs((xmlNsPtr) contextNode); 11580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == contextObj) { 11582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't free the temporary XPath object holding the 11584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context node, in order to avoid massive recreation 11585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * inside this loop. 11586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePop(ctxt); 11588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetClear(contextObj->nodesetval, hasNsNodes); 11589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 11590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: The object was lost in the evaluation machinery. 11592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Can this happen? Maybe in internal-error cases. 11593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextObj = NULL; 11595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextObj != NULL) { 11599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == contextObj) 11600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePop(ctxt); 11601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(xpctxt, contextObj); 11602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectevaluation_exit: 11604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exprRes != NULL) 11605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, exprRes); 11606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reset/invalidate the context. 11608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->node = oldContextNode; 11610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->doc = oldContextDoc; 11611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->contextSize = -1; 11612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->proximityPosition = -1; 11613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(newContextSize); 11614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(contextSize); 11616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 11617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 11619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalPositionalPredicate(xmlXPathParserContextPtr ctxt, 11620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr op, 11621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr set, 11622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int contextSize, 11623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int minPos, 11624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxPos, 11625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int hasNsNodes) 11626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 11627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) { 11628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprPtr comp = ctxt->comp; 11629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->steps[op->ch1].op != XPATH_OP_PREDICATE) { 11630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: raise an internal error. 11632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextSize = xmlXPathCompOpEvalPredicate(ctxt, 11635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[op->ch1], set, contextSize, hasNsNodes); 11636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 11637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextSize <= 0) 11638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 11639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the node set contains a sufficient number of nodes for 11642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the requested range. 11643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextSize < minPos) { 11645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetClear(set, hasNsNodes); 11646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 11647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 == -1) { 11649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: Can this ever happen? 11651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (contextSize); 11653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 11654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr oldContextDoc; 11655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, pos = 0, newContextSize = 0, contextPos = 0, res; 11656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr exprOp; 11657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr contextObj = NULL, exprRes = NULL; 11658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr oldContextNode, contextNode = NULL; 11659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextPtr xpctxt = ctxt->context; 11660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 11662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * URGENT TODO: Check the following: 11664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We don't expect location sets if evaluating prediates, right? 11665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Only filters should expect location sets, right? 11666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_XPTR_ENABLED */ 11668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Save old context. 11671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldContextNode = xpctxt->node; 11673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldContextDoc = xpctxt->doc; 11674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the expression of this predicate. 11676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exprOp = &ctxt->comp->steps[op->ch2]; 11678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < set->nodeNr; i++) { 11679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (set->nodeTab[i] == NULL) 11680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 11681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextNode = set->nodeTab[i]; 11683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->node = contextNode; 11684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->contextSize = contextSize; 11685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->proximityPosition = ++contextPos; 11686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initialize the new set. 11689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Also set the xpath document in case things like 11690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * key() evaluation are attempted on the predicate 11691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((contextNode->type != XML_NAMESPACE_DECL) && 11693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (contextNode->doc != NULL)) 11694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->doc = contextNode->doc; 11695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the predicate expression with 1 context node 11697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * at a time; this node is packaged into a node set; this 11698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node set is handed over to the evaluation mechanism. 11699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextObj == NULL) 11701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextObj = xmlXPathCacheNewNodeSet(xpctxt, contextNode); 11702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 11703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique(contextObj->nodesetval, 11704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextNode); 11705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, contextObj); 11707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathCompOpEvalToBoolean(ctxt, exprOp, 1); 11708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->error != XPATH_EXPRESSION_OK) || (res == -1)) { 11710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr tmp; 11711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* pop the result */ 11712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = valuePop(ctxt); 11713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(xpctxt, tmp); 11714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* then pop off contextObj, which will be freed later */ 11715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePop(ctxt); 11716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto evaluation_error; 11717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res) 11720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pos++; 11721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res && (pos >= minPos) && (pos <= maxPos)) { 11723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Fits in the requested range. 11725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newContextSize++; 11727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (minPos == maxPos) { 11728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Only 1 node was requested. 11730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextNode->type == XML_NAMESPACE_DECL) { 11732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * As always: take care of those nasty 11734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * namespace nodes. 11735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set->nodeTab[i] = NULL; 11737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetClear(set, hasNsNodes); 11739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set->nodeNr = 1; 11740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set->nodeTab[0] = contextNode; 11741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto evaluation_exit; 11742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (pos == maxPos) { 11744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We are done. 11746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetClearFromPos(set, i +1, hasNsNodes); 11748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto evaluation_exit; 11749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 11751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Remove the entry from the initial node set. 11753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project set->nodeTab[i] = NULL; 11755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextNode->type == XML_NAMESPACE_DECL) 11756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetFreeNs((xmlNsPtr) contextNode); 11757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exprRes != NULL) { 11759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, exprRes); 11760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exprRes = NULL; 11761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == contextObj) { 11763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't free the temporary XPath object holding the 11765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context node, in order to avoid massive recreation 11766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * inside this loop. 11767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePop(ctxt); 11769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetClear(contextObj->nodesetval, hasNsNodes); 11770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 11771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The object was lost in the evaluation machinery. 11773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Can this happen? Maybe in case of internal-errors. 11774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextObj = NULL; 11776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto evaluation_exit; 11779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectevaluation_error: 11781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetClear(set, hasNsNodes); 11782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newContextSize = 0; 11783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectevaluation_exit: 11785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextObj != NULL) { 11786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == contextObj) 11787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePop(ctxt); 11788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(xpctxt, contextObj); 11789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (exprRes != NULL) 11791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, exprRes); 11792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reset/invalidate the context. 11794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->node = oldContextNode; 11796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->doc = oldContextDoc; 11797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->contextSize = -1; 11798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->proximityPosition = -1; 11799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(newContextSize); 11800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(contextSize); 11802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 11803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 11805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathIsPositionalPredicate(xmlXPathParserContextPtr ctxt, 11806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr op, 11807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *maxPos) 11808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 11809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr exprOp; 11811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * BIG NOTE: This is not intended for XPATH_OP_FILTER yet! 11814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If not -1, then ch1 will point to: 11818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1) For predicates (XPATH_OP_PREDICATE): 11819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - an inner predicate operator 11820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2) For filters (XPATH_OP_FILTER): 11821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - an inner filter operater OR 11822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - an expression selecting the node set. 11823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * E.g. "key('a', 'b')" or "(//foo | //bar)". 11824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((op->op != XPATH_OP_PREDICATE) && (op->op != XPATH_OP_FILTER)) 11826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 11827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) { 11829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project exprOp = &ctxt->comp->steps[op->ch2]; 11830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 11831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 11832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((exprOp != NULL) && 11834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exprOp->op == XPATH_OP_VALUE) && 11835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (exprOp->value4 != NULL) && 11836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (((xmlXPathObjectPtr) exprOp->value4)->type == XPATH_NUMBER)) 11837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 11838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We have a "[n]" predicate here. 11840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: Unfortunately this simplistic test here is not 11841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * able to detect a position() predicate in compound 11842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * expressions like "[@attr = 'a" and position() = 1], 11843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and even not the usage of position() in 11844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * "[position() = 1]"; thus - obviously - a position-range, 11845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * like it "[position() < 5]", is also not detected. 11846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Maybe we could rewrite the AST to ease the optimization. 11847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *maxPos = (int) ((xmlXPathObjectPtr) exprOp->value4)->floatval; 11849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((xmlXPathObjectPtr) exprOp->value4)->floatval == 11851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (float) *maxPos) 11852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 11853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 11854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 11857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 11858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 11860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathNodeCollectAndTest(xmlXPathParserContextPtr ctxt, 11861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr op, 11862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr * first, xmlNodePtr * last, 11863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int toBool) 11864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 11865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_TEST_HIT \ 11867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (hasAxisRange != 0) { \ 11868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (++pos == maxPos) { \ 11869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project addNode(seq, cur); \ 11870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto axis_range_end; } \ 11871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { \ 11872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project addNode(seq, cur); \ 11873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (breakOnFirstHit) goto first_hit; } 11874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XP_TEST_HIT_NS \ 11876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (hasAxisRange != 0) { \ 11877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (++pos == maxPos) { \ 11878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hasNsNodes = 1; \ 11879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddNs(seq, xpctxt->node, (xmlNsPtr) cur); \ 11880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto axis_range_end; } \ 11881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { \ 11882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hasNsNodes = 1; \ 11883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddNs(seq, \ 11884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->node, (xmlNsPtr) cur); \ 11885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (breakOnFirstHit) goto first_hit; } 11886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathAxisVal axis = (xmlXPathAxisVal) op->value; 11888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathTestVal test = (xmlXPathTestVal) op->value2; 11889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathTypeVal type = (xmlXPathTypeVal) op->value3; 11890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *prefix = op->value4; 11891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name = op->value5; 11892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *URI = NULL; 11893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 11895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbMatches = 0, prevMatches = 0; 11896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 11897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int total = 0, hasNsNodes = 0; 11898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* The popped object holding the context nodes */ 11899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr obj; 11900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* The set of context nodes for the node tests */ 11901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr contextSeq; 11902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int contextIdx; 11903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr contextNode; 11904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* The context node for a compound traversal */ 11905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr outerContextNode; 11906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* The final resulting node set wrt to all context nodes */ 11907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr outSeq; 11908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The temporary resulting node set wrt 1 context node. 11910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Used to feed predicate evaluation. 11911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr seq; 11913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur; 11914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* First predicate operator */ 11915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr predOp; 11916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxPos; /* The requested position() (when a "[n]" predicate) */ 11917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int hasPredicateRange, hasAxisRange, pos, size, newSize; 11918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int breakOnFirstHit; 11919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathTraversalFunction next = NULL; 11921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* compound axis traversal */ 11922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathTraversalFunctionExt outerNext = NULL; 11923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void (*addNode) (xmlNodeSetPtr, xmlNodePtr); 11924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetMergeFunction mergeAndClear; 11925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr oldContextNode; 11926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextPtr xpctxt = ctxt->context; 11927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 11929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_NODESET); 11930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 11931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Setup namespaces. 11933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix != NULL) { 11935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URI = xmlXPathNsLookup(xpctxt, prefix); 11936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (URI == NULL) { 11937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(xpctxt, obj); 11938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR0(XPATH_UNDEF_PREFIX_ERROR); 11939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Setup axis. 11943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * MAYBE FUTURE TODO: merging optimizations: 11945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - If the nodes to be traversed wrt to the initial nodes and 11946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the current axis cannot overlap, then we could avoid searching 11947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for duplicates during the merge. 11948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * But the question is how/when to evaluate if they cannot overlap. 11949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Example: if we know that for two initial nodes, the one is 11950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * not in the ancestor-or-self axis of the other, then we could safely 11951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * avoid a duplicate-aware merge, if the axis to be traversed is e.g. 11952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the descendant-or-self axis. 11953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project addNode = xmlXPathNodeSetAdd; 11955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mergeAndClear = xmlXPathNodeSetMergeAndClear; 11956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (axis) { 11957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_ANCESTOR: 11958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project first = NULL; 11959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextAncestor; 11960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_ANCESTOR_OR_SELF: 11962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project first = NULL; 11963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextAncestorOrSelf; 11964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_ATTRIBUTE: 11966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project first = NULL; 11967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = NULL; 11968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextAttribute; 11969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls; 11970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_CHILD: 11972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = NULL; 11973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->rewriteType == XP_REWRITE_DOS_CHILD_ELEM) { 11974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This iterator will give us only nodes which can 11976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * hold element nodes. 11977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outerNext = xmlXPathNextDescendantOrSelfElemParent; 11979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 11980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((test == NODE_TEST_NAME) || (test == NODE_TEST_ALL)) && 11981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (type == NODE_TYPE_NODE)) 11982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 11983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 11984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Optimization if an element node type is 'element'. 11985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 11986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextChildElement; 11987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 11988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextChild; 11989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls; 11990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_DESCENDANT: 11992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = NULL; 11993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextDescendant; 11994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_DESCENDANT_OR_SELF: 11996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = NULL; 11997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextDescendantOrSelf; 11998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 11999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_FOLLOWING: 12000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = NULL; 12001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextFollowing; 12002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_FOLLOWING_SIBLING: 12004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = NULL; 12005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextFollowingSibling; 12006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_NAMESPACE: 12008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project first = NULL; 12009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = NULL; 12010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = (xmlXPathTraversalFunction) xmlXPathNextNamespace; 12011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls; 12012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_PARENT: 12014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project first = NULL; 12015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextParent; 12016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_PRECEDING: 12018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project first = NULL; 12019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextPrecedingInternal; 12020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_PRECEDING_SIBLING: 12022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project first = NULL; 12023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextPrecedingSibling; 12024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case AXIS_SELF: 12026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project first = NULL; 12027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last = NULL; 12028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = xmlXPathNextSelf; 12029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls; 12030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 12034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDebugDumpStepAxis(axis, test, 12035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (obj->nodesetval != NULL) ? obj->nodsetval->nodeNr : 0); 12036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 12037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (next == NULL) { 12039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(xpctxt, obj); 12040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 12041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextSeq = obj->nodesetval; 12043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((contextSeq == NULL) || (contextSeq->nodeNr <= 0)) { 12044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(xpctxt, obj); 12045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheWrapNodeSet(xpctxt, NULL)); 12046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 12047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Predicate optimization --------------------------------------------- 12050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If this step has a last predicate, which contains a position(), 12051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then we'll optimize (although not exactly "position()", but only 12052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the short-hand form, i.e., "[n]". 12053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 12054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Example - expression "/foo[parent::bar][1]": 12055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 12056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * COLLECT 'child' 'name' 'node' foo -- op (we are here) 12057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ROOT -- op->ch1 12058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * PREDICATE -- op->ch2 (predOp) 12059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * PREDICATE -- predOp->ch1 = [parent::bar] 12060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SORT 12061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * COLLECT 'parent' 'name' 'node' bar 12062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NODE 12063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ELEM Object is a number : 1 -- predOp->ch2 = [1] 12064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 12065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project maxPos = 0; 12067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project predOp = NULL; 12068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hasPredicateRange = 0; 12069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hasAxisRange = 0; 12070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) { 12071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * There's at least one predicate. 16 == XPATH_OP_PREDICATE 12073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project predOp = &ctxt->comp->steps[op->ch2]; 12075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathIsPositionalPredicate(ctxt, predOp, &maxPos)) { 12076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (predOp->ch1 != -1) { 12077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Use the next inner predicate operator. 12079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project predOp = &ctxt->comp->steps[predOp->ch1]; 12081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hasPredicateRange = 1; 12082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 12083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * There's no other predicate than the [n] predicate. 12085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project predOp = NULL; 12087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hasAxisRange = 1; 12088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project breakOnFirstHit = ((toBool) && (predOp == NULL)) ? 1 : 0; 12092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Axis traversal ----------------------------------------------------- 12094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2.3 Node Tests 12097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - For the attribute axis, the principal node type is attribute. 12098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - For the namespace axis, the principal node type is namespace. 12099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - For other axes, the principal node type is element. 12100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 12101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A node test * is true for any node of the 12102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * principal node type. For example, child::* will 12103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * select all element children of the context node 12104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldContextNode = xpctxt->node; 12106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project addNode = xmlXPathNodeSetAddUnique; 12107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outSeq = NULL; 12108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project seq = NULL; 12109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outerContextNode = NULL; 12110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextNode = NULL; 12111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextIdx = 0; 12112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((contextIdx < contextSeq->nodeNr) || (contextNode != NULL)) { 12115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (outerNext != NULL) { 12116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is a compound traversal. 12118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextNode == NULL) { 12120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the context for the outer traversal. 12122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outerContextNode = contextSeq->nodeTab[contextIdx++]; 12124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextNode = outerNext(NULL, outerContextNode); 12125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 12126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project contextNode = outerNext(contextNode, outerContextNode); 12127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (contextNode == NULL) 12128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 12129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the context for the main traversal. 12131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->node = contextNode; 12133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 12134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->node = contextSeq->nodeTab[contextIdx++]; 12135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (seq == NULL) { 12137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project seq = xmlXPathNodeSetCreate(NULL); 12138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (seq == NULL) { 12139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total = 0; 12140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 12141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Traverse the axis and test the nodes. 12145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pos = 0; 12147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = NULL; 12148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hasNsNodes = 0; 12149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 12150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = next(ctxt, cur); 12151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 12152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * QUESTION TODO: What does the "first" and "last" stuff do? 12156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((first != NULL) && (*first != NULL)) { 12158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*first == cur) 12159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((total % 256) == 0) && 12161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON 12162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathCmpNodesExt(*first, cur) >= 0)) 12163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 12164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathCmpNodes(*first, cur) >= 0)) 12165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 12166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((last != NULL) && (*last != NULL)) { 12171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*last == cur) 12172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((total % 256) == 0) && 12174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON 12175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathCmpNodesExt(cur, *last) >= 0)) 12176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 12177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathCmpNodes(cur, *last) >= 0)) 12178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 12179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total++; 12185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 12187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, " %s", cur->name); 12188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 12189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (test) { 12191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_NONE: 12192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total = 0; 12193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project STRANGE 12194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 12195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_TYPE: 12196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: Don't we need to use 12198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetAddNs() for namespace nodes here? 12199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Surprisingly, some c14n tests fail, if we do this. 12200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type == NODE_TYPE_NODE) { 12202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 12203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_NODE: 12204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_HTML_DOCUMENT_NODE: 12205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED 12206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCB_DOCUMENT_NODE: 12207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 12208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 12209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: 12210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 12211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 12212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 12213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 12214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: 12215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT 12216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 12218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (cur->type == type) { 12221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type == XML_NAMESPACE_DECL) 12222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT_NS 12223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 12224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT 12225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((type == NODE_TYPE_TEXT) && 12226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_CDATA_SECTION_NODE)) 12227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT 12229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_PI: 12232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type == XML_PI_NODE) && 12233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((name == NULL) || xmlStrEqual(name, cur->name))) 12234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT 12236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_ALL: 12239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (axis == AXIS_ATTRIBUTE) { 12240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_ATTRIBUTE_NODE) 12241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT 12243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (axis == AXIS_NAMESPACE) { 12245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_NAMESPACE_DECL) 12246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT_NS 12248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 12250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_ELEMENT_NODE) { 12251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix == NULL) 12252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT 12254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((cur->ns != NULL) && 12256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(URI, cur->ns->href))) 12257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT 12259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_NS:{ 12264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO; 12265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case NODE_TEST_NAME: 12268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (axis == AXIS_ATTRIBUTE) { 12269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type != XML_ATTRIBUTE_NODE) 12270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (axis == AXIS_NAMESPACE) { 12272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type != XML_NAMESPACE_DECL) 12273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 12275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type != XML_ELEMENT_NODE) 12276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 12279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 12280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, cur->name)) { 12281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix == NULL) { 12282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->ns == NULL) 12283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT 12285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 12287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->ns != NULL) && 12288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(URI, cur->ns->href))) 12289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT 12291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE:{ 12296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlAttrPtr attr = (xmlAttrPtr) cur; 12297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, attr->name)) { 12299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix == NULL) { 12300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attr->ns == NULL) || 12301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (attr->ns->prefix == NULL)) 12302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT 12304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 12306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((attr->ns != NULL) && 12307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(URI, 12308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project attr->ns->href))) 12309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT 12311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: 12317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_NAMESPACE_DECL) { 12318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns = (xmlNsPtr) cur; 12319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ns->prefix != NULL) && (name != NULL) 12321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (xmlStrEqual(ns->prefix, name))) 12322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 12323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_TEST_HIT_NS 12324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 12328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } /* switch(test) */ 12332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (cur != NULL); 12333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto apply_predicates; 12335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectaxis_range_end: /* ----------------------------------------------------- */ 12337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We have a "/foo[n]", and position() = n was reached. 12339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that we can have as well "/foo/::parent::foo[1]", so 12340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a duplicate-aware merge is still needed. 12341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Merge with the result. 12342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (outSeq == NULL) { 12344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outSeq = seq; 12345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project seq = NULL; 12346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 12347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outSeq = mergeAndClear(outSeq, seq, 0); 12348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Break if only a true/false result was requested. 12350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (toBool) 12352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 12354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfirst_hit: /* ---------------------------------------------------------- */ 12356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Break if only a true/false result was requested and 12358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * no predicates existed and a node test succeeded. 12359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (outSeq == NULL) { 12361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outSeq = seq; 12362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project seq = NULL; 12363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 12364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outSeq = mergeAndClear(outSeq, seq, 0); 12365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 12368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (seq != NULL) 12369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbMatches += seq->nodeNr; 12370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 12371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectapply_predicates: /* --------------------------------------------------- */ 12373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Apply predicates. 12375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((predOp != NULL) && (seq->nodeNr > 0)) { 12377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * E.g. when we have a "/foo[some expression][n]". 12379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * QUESTION TODO: The old predicate evaluation took into 12382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * account location-sets. 12383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (E.g. ctxt->value->type == XPATH_LOCATIONSET) 12384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Do we expect such a set here? 12385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * All what I learned now from the evaluation semantics 12386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * does not indicate that a location-set will be processed 12387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * here, so this looks OK. 12388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Iterate over all predicates, starting with the outermost 12391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * predicate. 12392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: Problem: we cannot execute the inner predicates first 12393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * since we cannot go back *up* the operator tree! 12394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Options we have: 12395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1) Use of recursive functions (like is it currently done 12396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * via xmlXPathCompOpEval()) 12397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2) Add a predicate evaluation information stack to the 12398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context struct 12399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3) Change the way the operators are linked; we need a 12400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * "parent" field on xmlXPathStepOp 12401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 12402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * For the moment, I'll try to solve this with a recursive 12403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * function: xmlXPathCompOpEvalPredicate(). 12404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project size = seq->nodeNr; 12406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (hasPredicateRange != 0) 12407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newSize = xmlXPathCompOpEvalPositionalPredicate(ctxt, 12408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project predOp, seq, size, maxPos, maxPos, hasNsNodes); 12409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 12410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newSize = xmlXPathCompOpEvalPredicate(ctxt, 12411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project predOp, seq, size, hasNsNodes); 12412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != XPATH_EXPRESSION_OK) { 12414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total = 0; 12415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 12416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add the filtered set of nodes to the result node set. 12419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (newSize == 0) { 12421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The predicates filtered all nodes out. 12423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetClear(seq, hasNsNodes); 12425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (seq->nodeNr > 0) { 12426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add to result set. 12428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (outSeq == NULL) { 12430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (size != newSize) { 12431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We need to merge and clear here, since 12433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the sequence will contained NULLed entries. 12434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outSeq = mergeAndClear(NULL, seq, 1); 12436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 12437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outSeq = seq; 12438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project seq = NULL; 12439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 12441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outSeq = mergeAndClear(outSeq, seq, 12442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (size != newSize) ? 1: 0); 12443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Break if only a true/false result was requested. 12445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (toBool) 12447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (seq->nodeNr > 0) { 12450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add to result set. 12452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (outSeq == NULL) { 12454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outSeq = seq; 12455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project seq = NULL; 12456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 12457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outSeq = mergeAndClear(outSeq, seq, 0); 12458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecterror: 12463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((obj->boolval) && (obj->user != NULL)) { 12464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * QUESTION TODO: What does this do and why? 12466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: Do we have to do this also for the "error" 12467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * cleanup further down? 12468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->boolval = 1; 12470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->user = obj->user; 12471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj->user = NULL; 12472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj->boolval = 0; 12473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(xpctxt, obj); 12475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Ensure we return at least an emtpy set. 12478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (outSeq == NULL) { 12480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((seq != NULL) && (seq->nodeNr == 0)) 12481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outSeq = seq; 12482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 12483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project outSeq = xmlXPathNodeSetCreate(NULL); 12484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((seq != NULL) && (seq != outSeq)) { 12486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeNodeSet(seq); 12487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Hand over the result. Better to push the set also in 12490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * case of errors. 12491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheWrapNodeSet(xpctxt, outSeq)); 12493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reset the context node. 12495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xpctxt->node = oldContextNode; 12497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STEP 12499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 12500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "\nExamined %d nodes, found %d nodes at that step\n", 12501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total, nbMatches); 12502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 12503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(total); 12505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 12506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 12508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalFilterFirst(xmlXPathParserContextPtr ctxt, 12509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr op, xmlNodePtr * first); 12510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 12512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompOpEvalFirst: 12513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath parser context with the compiled expression 12514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @op: an XPath compiled operation 12515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @first: the first elem found so far 12516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 12517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled XPath operation searching only the first 12518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element in document order 12519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 12520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of examined objects. 12521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 12523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalFirst(xmlXPathParserContextPtr ctxt, 12524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr op, xmlNodePtr * first) 12525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 12526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int total = 0, cur; 12527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprPtr comp; 12528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg1, arg2; 12529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = ctxt->comp; 12532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (op->op) { 12533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_END: 12534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 12535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_UNION: 12536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total = 12537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEvalFirst(ctxt, &comp->steps[op->ch1], 12538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project first); 12539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value != NULL) 12541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->type == XPATH_NODESET) 12542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->nodesetval != NULL) 12543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->nodesetval->nodeNr >= 1)) { 12544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * limit tree traversing to first node in the result 12546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * OPTIMIZE TODO: This implicitely sorts 12549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the result, even if not needed. E.g. if the argument 12550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the count() function, no sorting is needed. 12551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * OPTIMIZE TODO: How do we know if the node-list wasn't 12552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * aready sorted? 12553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->nodesetval->nodeNr > 1) 12555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(ctxt->value->nodesetval); 12556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *first = ctxt->value->nodesetval->nodeTab[0]; 12557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = 12559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEvalFirst(ctxt, &comp->steps[op->ch2], 12560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project first); 12561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_NODESET); 12563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2 = valuePop(ctxt); 12564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_NODESET); 12566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = valuePop(ctxt); 12567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1->nodesetval = xmlXPathNodeSetMerge(arg1->nodesetval, 12569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2->nodesetval); 12570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, arg1); 12571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 12572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* optimizer */ 12573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (total > cur) 12574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompSwap(op); 12575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total + cur); 12576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_ROOT: 12577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRoot(ctxt); 12578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 12579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_NODE: 12580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 12581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 12582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 12584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 12585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, 12587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node)); 12588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_RESET: 12590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 12591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 12592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 12594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 12595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 12597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_COLLECT:{ 12599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 == -1) 12600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total = xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 12603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathNodeCollectAndTest(ctxt, op, first, NULL, 0); 12606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_VALUE: 12609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 12610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheObjectCopy(ctxt->context, 12611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathObjectPtr) op->value4)); 12612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 12613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_SORT: 12614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 12615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 12616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEvalFirst(ctxt, &comp->steps[op->ch1], 12617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project first); 12618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value != NULL) 12620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->type == XPATH_NODESET) 12621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->nodesetval != NULL) 12622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->nodesetval->nodeNr > 1)) 12623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(ctxt->value->nodesetval); 12624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_FILTER_FIRST 12626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_FILTER: 12627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total =+ xmlXPathCompOpEvalFilterFirst(ctxt, op, first); 12628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 12630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 12631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlXPathCompOpEval(ctxt, op)); 12632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 12634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 12636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompOpEvalLast: 12637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath parser context with the compiled expression 12638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @op: an XPath compiled operation 12639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @last: the last elem found so far 12640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 12641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled XPath operation searching only the last 12642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element in document order 12643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 12644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of nodes traversed 12645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 12647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalLast(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op, 12648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr * last) 12649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 12650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int total = 0, cur; 12651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprPtr comp; 12652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg1, arg2; 12653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr bak; 12654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr bakd; 12655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int pp; 12656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int cs; 12657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = ctxt->comp; 12660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (op->op) { 12661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_END: 12662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 12663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_UNION: 12664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bakd = ctxt->context->doc; 12665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bak = ctxt->context->node; 12666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pp = ctxt->context->proximityPosition; 12667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cs = ctxt->context->contextSize; 12668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total = 12669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEvalLast(ctxt, &comp->steps[op->ch1], last); 12670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value != NULL) 12672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->type == XPATH_NODESET) 12673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->nodesetval != NULL) 12674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->nodesetval->nodeNr >= 1)) { 12675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * limit tree traversing to first node in the result 12677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->nodesetval->nodeNr > 1) 12679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(ctxt->value->nodesetval); 12680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *last = 12681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->nodesetval->nodeTab[ctxt->value-> 12682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nodesetval->nodeNr - 12683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1]; 12684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = bakd; 12686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = bak; 12687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = pp; 12688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = cs; 12689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = 12690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEvalLast(ctxt, &comp->steps[op->ch2], last); 12691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value != NULL) 12693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->type == XPATH_NODESET) 12694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->nodesetval != NULL) 12695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->nodesetval->nodeNr >= 1)) { /* TODO: NOP ? */ 12696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_NODESET); 12698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2 = valuePop(ctxt); 12699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_NODESET); 12701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = valuePop(ctxt); 12702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1->nodesetval = xmlXPathNodeSetMerge(arg1->nodesetval, 12704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2->nodesetval); 12705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, arg1); 12706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 12707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* optimizer */ 12708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (total > cur) 12709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompSwap(op); 12710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total + cur); 12711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_ROOT: 12712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRoot(ctxt); 12713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 12714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_NODE: 12715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 12716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 12717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 12719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 12720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, 12722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node)); 12723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_RESET: 12725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 12726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 12727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 12729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 12730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 12732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_COLLECT:{ 12734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 == -1) 12735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 12736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 12738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathNodeCollectAndTest(ctxt, op, NULL, last, 0); 12741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_VALUE: 12744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 12745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheObjectCopy(ctxt->context, 12746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathObjectPtr) op->value4)); 12747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 12748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_SORT: 12749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 12750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 12751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEvalLast(ctxt, &comp->steps[op->ch1], 12752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project last); 12753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value != NULL) 12755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->type == XPATH_NODESET) 12756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->nodesetval != NULL) 12757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->value->nodesetval->nodeNr > 1)) 12758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(ctxt->value->nodesetval); 12759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 12761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlXPathCompOpEval(ctxt, op)); 12762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 12764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_FILTER_FIRST 12766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 12767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalFilterFirst(xmlXPathParserContextPtr ctxt, 12768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr op, xmlNodePtr * first) 12769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 12770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int total = 0; 12771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprPtr comp; 12772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr res; 12773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr obj; 12774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr oldset; 12775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr oldnode; 12776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr oldDoc; 12777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 12778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = ctxt->comp; 12781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Optimization for ()[last()] selection i.e. the last elem 12783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((op->ch1 != -1) && (op->ch2 != -1) && 12785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[op->ch1].op == XPATH_OP_SORT) && 12786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[op->ch2].op == XPATH_OP_SORT)) { 12787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int f = comp->steps[op->ch2].ch1; 12788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((f != -1) && 12790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[f].op == XPATH_OP_FUNCTION) && 12791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[f].value5 == NULL) && 12792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[f].value == 0) && 12793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[f].value4 != NULL) && 12794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual 12795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[f].value4, BAD_CAST "last"))) { 12796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr last = NULL; 12797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 12799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEvalLast(ctxt, 12800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[op->ch1], 12801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &last); 12802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The nodeset should be in document order, 12805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Keep only the last value 12806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value != NULL) && 12808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->type == XPATH_NODESET) && 12809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->nodesetval != NULL) && 12810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->nodesetval->nodeTab != NULL) && 12811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->nodesetval->nodeNr > 1)) { 12812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->nodesetval->nodeTab[0] = 12813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->nodesetval->nodeTab[ctxt-> 12814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value-> 12815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nodesetval-> 12816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nodeNr - 12817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1]; 12818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->nodesetval->nodeNr = 1; 12819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *first = *(ctxt->value->nodesetval->nodeTab); 12820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 12826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 12827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 == -1) 12829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == NULL) 12831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 12834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldnode = ctxt->context->node; 12835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Hum are we filtering the result of an XPointer expression 12837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->type == XPATH_LOCATIONSET) { 12839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr tmp = NULL; 12840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlLocationSetPtr newlocset = NULL; 12841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlLocationSetPtr oldlocset; 12842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extract the old locset, and then evaluate the result of the 12845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * expression for all the element in the locset. use it to grow 12846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * up a new locset. 12847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_LOCATIONSET); 12849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 12850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldlocset = obj->user; 12851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 12852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((oldlocset == NULL) || (oldlocset->locNr == 0)) { 12854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = 0; 12855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = 0; 12856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 12857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 12858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 12859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) { 12860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, res); 12861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, obj); 12863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newlocset = xmlXPtrLocationSetCreate(NULL); 12867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < oldlocset->locNr; i++) { 12869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Run the evaluation with a node list made of a 12871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * single item in the nodelocset. 12872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = oldlocset->locTab[i]->user; 12874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = oldlocset->locNr; 12875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = i + 1; 12876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 12877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlXPathCacheNewNodeSet(ctxt->context, 12878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node); 12879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 12880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique(tmp->nodesetval, 12881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node); 12882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, tmp); 12884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 12885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 12886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != XPATH_EXPRESSION_OK) { 12887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(obj); 12888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 12889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The result of the evaluation need to be tested to 12892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * decided whether the filter succeeded or not 12893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 12895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathEvaluatePredicateResult(ctxt, res)) { 12896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPtrLocationSetAdd(newlocset, 12897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheObjectCopy(ctxt->context, 12898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldlocset->locTab[i])); 12899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup 12902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) { 12904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, res); 12905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == tmp) { 12907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePop(ctxt); 12908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetClear(tmp->nodesetval, 1); 12909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * REVISIT TODO: Don't create a temporary nodeset 12911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for everly iteration. 12912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* OLD: xmlXPathFreeObject(res); */ 12914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 12915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = NULL; 12916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 12917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Only put the first node in the result, then leave. 12919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (newlocset->locNr > 0) { 12921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *first = (xmlNodePtr) oldlocset->locTab[i]->user; 12922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 12923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != NULL) { 12926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, tmp); 12927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The result is used as the new evaluation locset. 12930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 12932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 12933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = -1; 12934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = -1; 12935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPtrWrapLocationSet(newlocset)); 12936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = oldnode; 12937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 12938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_XPTR_ENABLED */ 12940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extract the old set, and then evaluate the result of the 12943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * expression for all the element in the set. use it to grow 12944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * up a new set. 12945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_NODESET); 12947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 12948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldset = obj->nodesetval; 12949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldnode = ctxt->context->node; 12951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldDoc = ctxt->context->doc; 12952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 12953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((oldset == NULL) || (oldset->nodeNr == 0)) { 12955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = 0; 12956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = 0; 12957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* QUESTION TODO: Why was this code commented out? 12958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 12959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 12960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, 12961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[op->ch2]); 12962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 12964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) 12965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(res); 12966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, obj); 12968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = oldnode; 12969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 12970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 12971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr newset; 12972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr tmp = NULL; 12973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initialize the new set. 12975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Also set the xpath document in case things like 12976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * key() evaluation are attempted on the predicate 12977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newset = xmlXPathNodeSetCreate(NULL); 12979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < oldset->nodeNr; i++) { 12981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 12982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Run the evaluation with a node list made of 12983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a single item in the nodeset. 12984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 12985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = oldset->nodeTab[i]; 12986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((oldset->nodeTab[i]->type != XML_NAMESPACE_DECL) && 12987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (oldset->nodeTab[i]->doc != NULL)) 12988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = oldset->nodeTab[i]->doc; 12989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 12990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlXPathCacheNewNodeSet(ctxt->context, 12991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node); 12992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 12993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique(tmp->nodesetval, 12994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node); 12995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 12996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, tmp); 12997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = oldset->nodeNr; 12998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = i + 1; 12999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 13000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 13001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != XPATH_EXPRESSION_OK) { 13002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeNodeSet(newset); 13003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(obj); 13004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 13005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The result of the evaluation needs to be tested to 13008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * decide whether the filter succeeded or not 13009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 13011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathEvaluatePredicateResult(ctxt, res)) { 13012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAdd(newset, oldset->nodeTab[i]); 13013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup 13016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) { 13018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, res); 13019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == tmp) { 13021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePop(ctxt); 13022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't free the temporary nodeset 13024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in order to avoid massive recreation inside this 13025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * loop. 13026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetClear(tmp->nodesetval, 1); 13028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 13029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = NULL; 13030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Only put the first node in the result, then leave. 13033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (newset->nodeNr > 0) { 13035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *first = *(newset->nodeTab); 13036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 13037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != NULL) { 13040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, tmp); 13041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The result is used as the new evaluation set. 13044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 13046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = -1; 13048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = -1; 13049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* may want to move this past the '}' later */ 13050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = oldDoc; 13051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context, newset)); 13052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = oldnode; 13054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(total); 13055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 13056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* XP_OPTIMIZED_FILTER_FIRST */ 13057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 13059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompOpEval: 13060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath parser context with the compiled expression 13061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @op: an XPath compiled operation 13062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 13063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled XPath operation 13064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of nodes traversed 13065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 13067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEval(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op) 13068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 13069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int total = 0; 13070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int equal, ret; 13071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprPtr comp; 13072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr arg1, arg2; 13073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr bak; 13074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr bakd; 13075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int pp; 13076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int cs; 13077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = ctxt->comp; 13080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (op->op) { 13081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_END: 13082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 13083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_AND: 13084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bakd = ctxt->context->doc; 13085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bak = ctxt->context->node; 13086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pp = ctxt->context->proximityPosition; 13087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cs = ctxt->context->contextSize; 13088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathBooleanFunction(ctxt, 1); 13091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value == NULL) || (ctxt->value->boolval == 0)) 13092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2 = valuePop(ctxt); 13094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = bakd; 13095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = bak; 13096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = pp; 13097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = cs; 13098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 13099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error) { 13100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg2); 13101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 13102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathBooleanFunction(ctxt, 1); 13104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = valuePop(ctxt); 13105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1->boolval &= arg2->boolval; 13106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, arg1); 13107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 13108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_OR: 13110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bakd = ctxt->context->doc; 13111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bak = ctxt->context->node; 13112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pp = ctxt->context->proximityPosition; 13113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cs = ctxt->context->contextSize; 13114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathBooleanFunction(ctxt, 1); 13117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value == NULL) || (ctxt->value->boolval == 1)) 13118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2 = valuePop(ctxt); 13120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = bakd; 13121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = bak; 13122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = pp; 13123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = cs; 13124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 13125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error) { 13126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(arg2); 13127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 13128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathBooleanFunction(ctxt, 1); 13130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = valuePop(ctxt); 13131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1->boolval |= arg2->boolval; 13132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, arg1); 13133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 13134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_EQUAL: 13136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bakd = ctxt->context->doc; 13137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bak = ctxt->context->node; 13138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pp = ctxt->context->proximityPosition; 13139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cs = ctxt->context->contextSize; 13140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = bakd; 13143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = bak; 13144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = pp; 13145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = cs; 13146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 13147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value) 13149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project equal = xmlXPathEqualValues(ctxt); 13150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 13151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project equal = xmlXPathNotEqualValues(ctxt); 13152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, equal)); 13153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_CMP: 13155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bakd = ctxt->context->doc; 13156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bak = ctxt->context->node; 13157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pp = ctxt->context->proximityPosition; 13158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cs = ctxt->context->contextSize; 13159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = bakd; 13162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = bak; 13163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = pp; 13164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = cs; 13165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 13166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCompareValues(ctxt, op->value, op->value2); 13168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, ret)); 13169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_PLUS: 13171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bakd = ctxt->context->doc; 13172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bak = ctxt->context->node; 13173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pp = ctxt->context->proximityPosition; 13174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cs = ctxt->context->contextSize; 13175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) { 13178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = bakd; 13179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = bak; 13180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = pp; 13181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = cs; 13182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 13183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value == 0) 13186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathSubValues(ctxt); 13187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (op->value == 1) 13188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathAddValues(ctxt); 13189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (op->value == 2) 13190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathValueFlipSign(ctxt); 13191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (op->value == 3) { 13192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_NUMBER; 13193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_NUMBER); 13194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_MULT: 13197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bakd = ctxt->context->doc; 13198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bak = ctxt->context->node; 13199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pp = ctxt->context->proximityPosition; 13200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cs = ctxt->context->contextSize; 13201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = bakd; 13204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = bak; 13205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = pp; 13206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = cs; 13207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 13208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value == 0) 13210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathMultValues(ctxt); 13211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (op->value == 1) 13212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDivValues(ctxt); 13213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (op->value == 2) 13214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathModValues(ctxt); 13215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_UNION: 13217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bakd = ctxt->context->doc; 13218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bak = ctxt->context->node; 13219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pp = ctxt->context->proximityPosition; 13220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cs = ctxt->context->contextSize; 13221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = bakd; 13224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = bak; 13225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = pp; 13226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = cs; 13227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 13228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_NODESET); 13230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2 = valuePop(ctxt); 13231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_NODESET); 13233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1 = valuePop(ctxt); 13234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((arg1->nodesetval == NULL) || 13236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((arg2->nodesetval != NULL) && 13237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (arg2->nodesetval->nodeNr != 0))) 13238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 13239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg1->nodesetval = xmlXPathNodeSetMerge(arg1->nodesetval, 13240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project arg2->nodesetval); 13241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, arg1); 13244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, arg2); 13245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_ROOT: 13247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRoot(ctxt); 13248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_NODE: 13250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 13251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 13254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 13255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, 13257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node)); 13258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_RESET: 13260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 13261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 13264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 13265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_COLLECT:{ 13269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 == -1) 13270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathNodeCollectAndTest(ctxt, op, NULL, NULL, 0); 13276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_VALUE: 13279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 13280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheObjectCopy(ctxt->context, 13281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathObjectPtr) op->value4)); 13282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_VARIABLE:{ 13284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr val; 13285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 13287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 13288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value5 == NULL) { 13290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlXPathVariableLookup(ctxt->context, op->value4); 13291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) { 13292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = XPATH_UNDEF_VARIABLE_ERROR; 13293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 13294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, val); 13296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 13297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *URI; 13298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URI = xmlXPathNsLookup(ctxt->context, op->value5); 13300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (URI == NULL) { 13301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 13302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathCompOpEval: variable %s bound to undefined prefix %s\n", 13303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op->value4, op->value5); 13304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlXPathVariableLookupNS(ctxt->context, 13307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op->value4, URI); 13308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (val == NULL) { 13309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = XPATH_UNDEF_VARIABLE_ERROR; 13310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 13311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, val); 13313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_FUNCTION:{ 13317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFunction func; 13318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *oldFunc, *oldFuncURI; 13319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 13320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 13322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 13323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->valueNr < op->value) { 13325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 13326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathCompOpEval: parameter error\n"); 13327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = XPATH_INVALID_OPERAND; 13328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < op->value; i++) 13331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->valueTab[(ctxt->valueNr - 1) - i] == NULL) { 13332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 13333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathCompOpEval: parameter error\n"); 13334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = XPATH_INVALID_OPERAND; 13335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->cache != NULL) 13338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_CAST_FPTR(func) = op->cache; 13339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 13340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *URI = NULL; 13341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value5 == NULL) 13343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project func = 13344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFunctionLookup(ctxt->context, 13345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op->value4); 13346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 13347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URI = xmlXPathNsLookup(ctxt->context, op->value5); 13348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (URI == NULL) { 13349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 13350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathCompOpEval: function %s bound to undefined prefix %s\n", 13351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op->value4, op->value5); 13352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project func = xmlXPathFunctionLookupNS(ctxt->context, 13355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op->value4, URI); 13356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (func == NULL) { 13358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 13359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathCompOpEval: function %s not found\n", 13360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op->value4); 13361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XP_ERROR0(XPATH_UNKNOWN_FUNC_ERROR); 13362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op->cache = XML_CAST_FPTR(func); 13364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op->cacheURI = (void *) URI; 13365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldFunc = ctxt->context->function; 13367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldFuncURI = ctxt->context->functionURI; 13368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->function = op->value4; 13369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->functionURI = op->cacheURI; 13370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project func(ctxt, op->value); 13371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->function = oldFunc; 13372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->functionURI = oldFuncURI; 13373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_ARG: 13376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bakd = ctxt->context->doc; 13377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project bak = ctxt->context->node; 13378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pp = ctxt->context->proximityPosition; 13379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cs = ctxt->context->contextSize; 13380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 13381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = cs; 13383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = pp; 13384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = bak; 13385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = bakd; 13386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) { 13388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); 13389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = bakd; 13390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = bak; 13391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_PREDICATE: 13395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_FILTER:{ 13396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr res; 13397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr obj, tmp; 13398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr newset = NULL; 13399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr oldset; 13400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr oldnode; 13401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr oldDoc; 13402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 13403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Optimization for ()[1] selection i.e. the first elem 13406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((op->ch1 != -1) && (op->ch2 != -1) && 13408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XP_OPTIMIZED_FILTER_FIRST 13409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * FILTER TODO: Can we assume that the inner processing 13411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will result in an ordered list if we have an 13412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XPATH_OP_FILTER? 13413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * What about an additional field or flag on 13414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathObject like @sorted ? This way we wouln'd need 13415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to assume anything, so it would be more robust and 13416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * easier to optimize. 13417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((comp->steps[op->ch1].op == XPATH_OP_SORT) || /* 18 */ 13419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[op->ch1].op == XPATH_OP_FILTER)) && /* 17 */ 13420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 13421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[op->ch1].op == XPATH_OP_SORT) && 13422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 13423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[op->ch2].op == XPATH_OP_VALUE)) { /* 12 */ 13424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr val; 13425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = comp->steps[op->ch2].value4; 13427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((val != NULL) && (val->type == XPATH_NUMBER) && 13428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (val->floatval == 1.0)) { 13429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr first = NULL; 13430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 13432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEvalFirst(ctxt, 13433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[op->ch1], 13434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &first); 13435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The nodeset should be in document order, 13438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Keep only the first value 13439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value != NULL) && 13441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->type == XPATH_NODESET) && 13442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->nodesetval != NULL) && 13443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->nodesetval->nodeNr > 1)) 13444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->nodesetval->nodeNr = 1; 13445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Optimization for ()[last()] selection i.e. the last elem 13450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((op->ch1 != -1) && (op->ch2 != -1) && 13452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[op->ch1].op == XPATH_OP_SORT) && 13453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[op->ch2].op == XPATH_OP_SORT)) { 13454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int f = comp->steps[op->ch2].ch1; 13455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((f != -1) && 13457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[f].op == XPATH_OP_FUNCTION) && 13458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[f].value5 == NULL) && 13459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[f].value == 0) && 13460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[f].value4 != NULL) && 13461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual 13462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[f].value4, BAD_CAST "last"))) { 13463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr last = NULL; 13464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 13466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEvalLast(ctxt, 13467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[op->ch1], 13468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &last); 13469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The nodeset should be in document order, 13472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Keep only the last value 13473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value != NULL) && 13475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->type == XPATH_NODESET) && 13476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->nodesetval != NULL) && 13477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->nodesetval->nodeTab != NULL) && 13478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->nodesetval->nodeNr > 1)) { 13479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->nodesetval->nodeTab[0] = 13480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->nodesetval->nodeTab[ctxt-> 13481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value-> 13482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nodesetval-> 13483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nodeNr - 13484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1]; 13485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value->nodesetval->nodeNr = 1; 13486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Process inner predicates first. 13492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Example "index[parent::book][1]": 13493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ... 13494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * PREDICATE <-- we are here "[1]" 13495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * PREDICATE <-- process "[parent::book]" first 13496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SORT 13497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * COLLECT 'parent' 'name' 'node' book 13498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NODE 13499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ELEM Object is a number : 1 13500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 13502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 13503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 == -1) 13506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == NULL) 13508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldnode = ctxt->context->node; 13511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 13513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Hum are we filtering the result of an XPointer expression 13515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->type == XPATH_LOCATIONSET) { 13517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlLocationSetPtr newlocset = NULL; 13518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlLocationSetPtr oldlocset; 13519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extract the old locset, and then evaluate the result of the 13522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * expression for all the element in the locset. use it to grow 13523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * up a new locset. 13524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_LOCATIONSET); 13526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 13527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldlocset = obj->user; 13528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((oldlocset == NULL) || (oldlocset->locNr == 0)) { 13531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = 0; 13532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = 0; 13533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 13534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 13535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, 13536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[op->ch2]); 13537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 13538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) { 13539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, res); 13540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, obj); 13542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newlocset = xmlXPtrLocationSetCreate(NULL); 13546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < oldlocset->locNr; i++) { 13548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Run the evaluation with a node list made of a 13550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * single item in the nodelocset. 13551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = oldlocset->locTab[i]->user; 13553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = oldlocset->locNr; 13554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = i + 1; 13555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlXPathCacheNewNodeSet(ctxt->context, 13556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node); 13557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, tmp); 13558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 13560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 13561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, 13562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[op->ch2]); 13563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != XPATH_EXPRESSION_OK) { 13564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(obj); 13565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 13566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The result of the evaluation need to be tested to 13570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * decided whether the filter succeeded or not 13571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 13573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathEvaluatePredicateResult(ctxt, res)) { 13574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPtrLocationSetAdd(newlocset, 13575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectCopy 13576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (oldlocset->locTab[i])); 13577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup 13581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) { 13583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, res); 13584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == tmp) { 13586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 13587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, res); 13588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The result is used as the new evaluation locset. 13595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 13597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = -1; 13599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = -1; 13600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPtrWrapLocationSet(newlocset)); 13601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = oldnode; 13602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_XPTR_ENABLED */ 13605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extract the old set, and then evaluate the result of the 13608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * expression for all the element in the set. use it to grow 13609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * up a new set. 13610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_NODESET); 13612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 13613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldset = obj->nodesetval; 13614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldnode = ctxt->context->node; 13616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldDoc = ctxt->context->doc; 13617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((oldset == NULL) || (oldset->nodeNr == 0)) { 13620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = 0; 13621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = 0; 13622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 13623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 13624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 13625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, 13626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[op->ch2]); 13627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 13629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) 13630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(res); 13631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/ 13632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, obj); 13633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = oldnode; 13634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 13636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = NULL; 13637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initialize the new set. 13639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Also set the xpath document in case things like 13640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * key() evaluation are attempted on the predicate 13641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newset = xmlXPathNodeSetCreate(NULL); 13643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SPEC XPath 1.0: 13645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * "For each node in the node-set to be filtered, the 13646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * PredicateExpr is evaluated with that node as the 13647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context node, with the number of nodes in the 13648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set as the context size, and with the proximity 13649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * position of the node in the node-set with respect to 13650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the axis as the context position;" 13651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @oldset is the node-set" to be filtered. 13652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 13653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SPEC XPath 1.0: 13654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * "only predicates change the context position and 13655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context size (see [2.4 Predicates])." 13656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Example: 13657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set context pos 13658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nA 1 13659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nB 2 13660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nC 3 13661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * After applying predicate [position() > 1] : 13662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-set context pos 13663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nB 1 13664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nC 2 13665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 13666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * removed the first node in the node-set, then 13667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the context position of the 13668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < oldset->nodeNr; i++) { 13670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Run the evaluation with a node list made of 13672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a single item in the nodeset. 13673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = oldset->nodeTab[i]; 13675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((oldset->nodeTab[i]->type != XML_NAMESPACE_DECL) && 13676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (oldset->nodeTab[i]->doc != NULL)) 13677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = oldset->nodeTab[i]->doc; 13678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 13679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlXPathCacheNewNodeSet(ctxt->context, 13680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node); 13681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 13682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique(tmp->nodesetval, 13683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node); 13684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, tmp); 13686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = oldset->nodeNr; 13687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = i + 1; 13688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the predicate against the context node. 13690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Can/should we optimize position() predicates 13691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * here (e.g. "[1]")? 13692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 13694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 13695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, 13696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[op->ch2]); 13697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != XPATH_EXPRESSION_OK) { 13698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeNodeSet(newset); 13699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(obj); 13700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 13701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The result of the evaluation needs to be tested to 13705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * decide whether the filter succeeded or not 13706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * OPTIMIZE TODO: Can we use 13709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathNodeSetAdd*Unique()* instead? 13710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 13712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlXPathEvaluatePredicateResult(ctxt, res)) { 13713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAdd(newset, oldset->nodeTab[i]); 13714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup 13718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) { 13720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, res); 13721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == tmp) { 13723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePop(ctxt); 13724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetClear(tmp->nodesetval, 1); 13725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't free the temporary nodeset 13727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in order to avoid massive recreation inside this 13728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * loop. 13729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 13731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = NULL; 13732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != NULL) 13735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, tmp); 13736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The result is used as the new evaluation set. 13738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 13740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = -1; 13742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = -1; 13743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* may want to move this past the '}' later */ 13744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->doc = oldDoc; 13745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, 13746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCacheWrapNodeSet(ctxt->context, newset)); 13747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = oldnode; 13749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_SORT: 13752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 13753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->value != NULL) && 13756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->type == XPATH_NODESET) && 13757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->nodesetval != NULL) && 13758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->value->nodesetval->nodeNr > 1)) 13759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 13760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetSort(ctxt->value->nodesetval); 13761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 13764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_RANGETO:{ 13765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr range; 13766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr res, obj; 13767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr tmp; 13768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlLocationSetPtr newlocset = NULL; 13769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlLocationSetPtr oldlocset; 13770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodeSetPtr oldset; 13771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j; 13772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 13774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 13775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); 13776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 == -1) 13777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value->type == XPATH_LOCATIONSET) { 13780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extract the old locset, and then evaluate the result of the 13782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * expression for all the element in the locset. use it to grow 13783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * up a new locset. 13784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_LOCATIONSET); 13786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 13787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldlocset = obj->user; 13788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((oldlocset == NULL) || (oldlocset->locNr == 0)) { 13790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = 0; 13792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = 0; 13793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += xmlXPathCompOpEval(ctxt,&comp->steps[op->ch2]); 13794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 13795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) { 13796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, res); 13797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, obj); 13799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR0; 13800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newlocset = xmlXPtrLocationSetCreate(NULL); 13803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < oldlocset->locNr; i++) { 13805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Run the evaluation with a node list made of a 13807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * single item in the nodelocset. 13808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = oldlocset->locTab[i]->user; 13810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = oldlocset->locNr; 13811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = i + 1; 13812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlXPathCacheNewNodeSet(ctxt->context, 13813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node); 13814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, tmp); 13815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 13817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 13818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, 13819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[op->ch2]); 13820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != XPATH_EXPRESSION_OK) { 13821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(obj); 13822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 13823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 13826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res->type == XPATH_LOCATIONSET) { 13827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlLocationSetPtr rloc = 13828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlLocationSetPtr)res->user; 13829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (j=0; j<rloc->locNr; j++) { 13830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project range = xmlXPtrNewRange( 13831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldlocset->locTab[i]->user, 13832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldlocset->locTab[i]->index, 13833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rloc->locTab[j]->user2, 13834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rloc->locTab[j]->index2); 13835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (range != NULL) { 13836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPtrLocationSetAdd(newlocset, range); 13837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 13840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project range = xmlXPtrNewRangeNodeObject( 13841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlNodePtr)oldlocset->locTab[i]->user, res); 13842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (range != NULL) { 13843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPtrLocationSetAdd(newlocset,range); 13844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup 13849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) { 13851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, res); 13852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == tmp) { 13854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 13855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, res); 13856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { /* Not a location set */ 13861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_TYPE0(XPATH_NODESET); 13862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project obj = valuePop(ctxt); 13863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldset = obj->nodesetval; 13864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project newlocset = xmlXPtrLocationSetCreate(NULL); 13867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (oldset != NULL) { 13869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < oldset->nodeNr; i++) { 13870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Run the evaluation with a node list made of a single item 13872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in the nodeset. 13873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = oldset->nodeTab[i]; 13875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * OPTIMIZE TODO: Avoid recreation for every iteration. 13877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlXPathCacheNewNodeSet(ctxt->context, 13879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node); 13880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, tmp); 13881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 13883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project total += 13884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, 13885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[op->ch2]); 13886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != XPATH_EXPRESSION_OK) { 13887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(obj); 13888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 13889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 13892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project range = 13893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPtrNewRangeNodeObject(oldset->nodeTab[i], 13894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res); 13895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (range != NULL) { 13896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPtrLocationSetAdd(newlocset, range); 13897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup 13901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != NULL) { 13903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, res); 13904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == tmp) { 13906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 13907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, res); 13908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The result is used as the new evaluation set. 13917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, obj); 13919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->node = NULL; 13920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->contextSize = -1; 13921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->context->proximityPosition = -1; 13922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPtrWrapLocationSet(newlocset)); 13923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_XPTR_ENABLED */ 13926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 13928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "XPath: unknown precompiled operation %d\n", op->op); 13929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (total); 13930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 13931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 13933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompOpEvalToBoolean: 13934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath parser context 13935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 13936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluates if the expression evaluates to true. 13937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 13938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if true, 0 if false and -1 on API or internal errors. 13939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 13941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompOpEvalToBoolean(xmlXPathParserContextPtr ctxt, 13942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr op, 13943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int isPredicate) 13944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 13945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr resObj = NULL; 13946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstart: 13948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* comp = ctxt->comp; */ 13949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (op->op) { 13950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_END: 13951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 13952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_VALUE: 13953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project resObj = (xmlXPathObjectPtr) op->value4; 13954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (isPredicate) 13955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathEvaluatePredicateResult(ctxt, resObj)); 13956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCastToBoolean(resObj)); 13957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_SORT: 13958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We don't need sorting for boolean results. Skip this one. 13960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) { 13962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op = &ctxt->comp->steps[op->ch1]; 13963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto start; 13964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 13966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_OP_COLLECT: 13967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 == -1) 13968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 13969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, &ctxt->comp->steps[op->ch1]); 13971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != XPATH_EXPRESSION_OK) 13972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 13973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeCollectAndTest(ctxt, op, NULL, NULL, 1); 13975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != XPATH_EXPRESSION_OK) 13976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 13977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project resObj = valuePop(ctxt); 13979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (resObj == NULL) 13980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 13981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 13982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 13983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 13984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Fallback to call xmlXPathCompOpEval(). 13985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, op); 13987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != XPATH_EXPRESSION_OK) 13988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 13989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project resObj = valuePop(ctxt); 13991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (resObj == NULL) 13992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 13993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 13994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 13995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (resObj) { 13997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int res; 13998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (resObj->type == XPATH_BOOLEAN) { 14000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = resObj->boolval; 14001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (isPredicate) { 14002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * For predicates a result of type "number" is handled 14004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * differently: 14005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SPEC XPath 1.0: 14006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * "If the result is a number, the result will be converted 14007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to true if the number is equal to the context position 14008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and will be converted to false otherwise;" 14009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathEvaluatePredicateResult(ctxt, resObj); 14011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 14012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathCastToBoolean(resObj); 14013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, resObj); 14015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(res); 14016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING 14022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRunStreamEval: 14024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath parser context with the compiled expression 14025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled Streamable XPath expression in the given context. 14027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 14029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRunStreamEval(xmlXPathContextPtr ctxt, xmlPatternPtr comp, 14030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr *resultSeq, int toBool) 14031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 14032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int max_depth, min_depth; 14033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int from_root; 14034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret, depth; 14035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int eval_all_nodes; 14036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur = NULL, limit = NULL; 14037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStreamCtxtPtr patstream = NULL; 14038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nb_nodes = 0; 14040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (comp == NULL)) 14042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 14043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max_depth = xmlPatternMaxDepth(comp); 14044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (max_depth == -1) 14045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 14046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (max_depth == -2) 14047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project max_depth = 10000; 14048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project min_depth = xmlPatternMinDepth(comp); 14049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min_depth == -1) 14050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 14051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project from_root = xmlPatternFromRoot(comp); 14052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (from_root < 0) 14053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 14054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 14055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("stream eval: depth %d from root %d\n", max_depth, from_root); 14056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (! toBool) { 14059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (resultSeq == NULL) 14060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 14061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *resultSeq = xmlXPathCacheNewNodeSet(ctxt, NULL); 14062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*resultSeq == NULL) 14063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 14064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * handle the special cases of "/" amd "." being matched 14068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (min_depth == 0) { 14070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (from_root) { 14071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Select "/" */ 14072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (toBool) 14073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 14074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, 14075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlNodePtr) ctxt->doc); 14076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 14077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Select "self::node()" */ 14078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (toBool) 14079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 14080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, ctxt->node); 14081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (max_depth == 0) { 14084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (from_root) { 14088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = (xmlNodePtr)ctxt->doc; 14089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->node != NULL) { 14090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (ctxt->node->type) { 14091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 14092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_NODE: 14093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_FRAG_NODE: 14094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_HTML_DOCUMENT_NODE: 14095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED 14096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCB_DOCUMENT_NODE: 14097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ctxt->node; 14099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 14100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_NODE: 14101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 14102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 14103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_REF_NODE: 14104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_NODE: 14105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 14106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 14107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NOTATION_NODE: 14108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DTD_NODE: 14109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_DOCUMENT_TYPE_NODE: 14110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_DECL: 14111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ATTRIBUTE_DECL: 14112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ENTITY_DECL: 14113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_NAMESPACE_DECL: 14114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_START: 14115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_XINCLUDE_END: 14116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 14117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project limit = cur; 14119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 14121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project patstream = xmlPatternGetStreamCtxt(comp); 14125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (patstream == NULL) { 14126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * QUESTION TODO: Is this an error? 14128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project eval_all_nodes = xmlStreamWantsAnyNode(patstream); 14133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (from_root) { 14135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStreamPush(patstream, NULL, NULL); 14136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 14137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret == 1) { 14138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (toBool) 14139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto return_1; 14140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, cur); 14141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth = 0; 14144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto scan_children; 14145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext_node: 14146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 14147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nb_nodes++; 14148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (cur->type) { 14150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ELEMENT_NODE: 14151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_TEXT_NODE: 14152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_CDATA_SECTION_NODE: 14153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_COMMENT_NODE: 14154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_PI_NODE: 14155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_ELEMENT_NODE) { 14156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStreamPush(patstream, cur->name, 14157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->ns ? cur->ns->href : NULL)); 14158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (eval_all_nodes) 14159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStreamPushNode(patstream, NULL, NULL, cur->type); 14160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 14161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 14162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret < 0) { 14164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* NOP. */ 14165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ret == 1) { 14166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (toBool) 14167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto return_1; 14168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, cur); 14169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->children == NULL) || (depth >= max_depth)) { 14171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStreamPop(patstream); 14172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur->next != NULL) { 14173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 14174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type != XML_ENTITY_DECL) && 14175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type != XML_DTD_NODE)) 14176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto next_node; 14177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 14180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 14181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectscan_children: 14184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->children != NULL) && (depth < max_depth)) { 14185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Do not descend on entities declarations 14187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->children->type != XML_ENTITY_DECL) { 14189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->children; 14190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth++; 14191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip DTDs 14193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type != XML_DTD_NODE) 14195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 14196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == limit) 14200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 14201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur->next != NULL) { 14203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 14204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type != XML_ENTITY_DECL) && 14205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type != XML_DTD_NODE)) 14206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto next_node; 14207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 14210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->parent; 14211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project depth--; 14212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur == NULL) || (cur == limit)) 14213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 14214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_ELEMENT_NODE) { 14215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStreamPop(patstream); 14216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((eval_all_nodes) && 14217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((cur->type == XML_TEXT_NODE) || 14218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_CDATA_SECTION_NODE) || 14219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_COMMENT_NODE) || 14220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type == XML_PI_NODE))) 14221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 14222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStreamPop(patstream); 14223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) { 14225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 14226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 14227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (cur != NULL); 14229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while ((cur != NULL) && (depth >= 0)); 14231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdone: 14233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 14235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("stream eval: checked %d nodes selected %d\n", 14236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nb_nodes, retObj->nodesetval->nodeNr); 14237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (patstream) 14240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeStreamCtxt(patstream); 14241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectreturn_1: 14244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (patstream) 14245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeStreamCtxt(patstream); 14246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 14247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* XPATH_STREAMING */ 14249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRunEval: 14252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath parser context with the compiled expression 14253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @toBool: evaluate to a boolean result 14254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled XPath expression in the given context. 14256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 14258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRunEval(xmlXPathParserContextPtr ctxt, int toBool) 14259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 14260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprPtr comp; 14261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->comp == NULL)) 14263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 14264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->valueTab == NULL) { 14266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Allocate the value stack */ 14267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valueTab = (xmlXPathObjectPtr *) 14268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(10 * sizeof(xmlXPathObjectPtr)); 14269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->valueTab == NULL) { 14270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathPErrMemory(ctxt, "creating evaluation context\n"); 14271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt); 14272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valueNr = 0; 14274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->valueMax = 10; 14275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->value = NULL; 14276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING 14278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->comp->stream) { 14279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int res; 14280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (toBool) { 14282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluation to boolean result. 14284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathRunStreamEval(ctxt->context, 14286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->comp->stream, NULL, 1); 14287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res != -1) 14288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(res); 14289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 14290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr resObj = NULL; 14291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluation to a sequence. 14294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathRunStreamEval(ctxt->context, 14296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->comp->stream, &resObj, 0); 14297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((res != -1) && (resObj != NULL)) { 14299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, resObj); 14300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (resObj != NULL) 14303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, resObj); 14304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * QUESTION TODO: This falls back to normal XPath evaluation 14307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if res == -1. Is this intended? 14308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = ctxt->comp; 14312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->last < 0) { 14313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 14314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathRunEval: last is less than zero\n"); 14315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 14316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (toBool) 14318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCompOpEvalToBoolean(ctxt, 14319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &comp->steps[comp->last], 0)); 14320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 14321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompOpEval(ctxt, &comp->steps[comp->last]); 14322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 14327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 14328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Public interfaces * 14329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 14330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 14331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEvalPredicate: 14334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 14335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @res: the Predicate Expression evaluation result 14336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate a predicate result for the current node. 14338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A PredicateExpr is evaluated by evaluating the Expr and converting 14339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the result to a boolean. If the result is a number, the result will 14340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be converted to true if the number is equal to the position of the 14341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context node in the context node list (as returned by the position 14342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * function) and will be converted to false otherwise; if the result 14343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is not a number, then the result will be converted as if by a call 14344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to the boolean function. 14345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if predicate is true, 0 otherwise 14347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 14349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEvalPredicate(xmlXPathContextPtr ctxt, xmlXPathObjectPtr res) { 14350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (res == NULL)) return(0); 14351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (res->type) { 14352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 14353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(res->boolval); 14354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 14355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(res->floatval == ctxt->proximityPosition); 14356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 14357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 14358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res->nodesetval == NULL) 14359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(res->nodesetval->nodeNr != 0); 14361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 14362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((res->stringval != NULL) && 14363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrlen(res->stringval) != 0)); 14364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 14365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project STRANGE 14366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEvaluatePredicateResult: 14372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 14373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @res: the Predicate Expression evaluation result 14374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate a predicate result for the current node. 14376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A PredicateExpr is evaluated by evaluating the Expr and converting 14377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the result to a boolean. If the result is a number, the result will 14378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be converted to true if the number is equal to the position of the 14379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context node in the context node list (as returned by the position 14380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * function) and will be converted to false otherwise; if the result 14381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is not a number, then the result will be converted as if by a call 14382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to the boolean function. 14383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if predicate is true, 0 otherwise 14385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 14387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEvaluatePredicateResult(xmlXPathParserContextPtr ctxt, 14388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr res) { 14389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (res == NULL)) return(0); 14390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (res->type) { 14391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 14392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(res->boolval); 14393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 14394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(__BORLANDC__) || (defined(_MSC_VER) && (_MSC_VER == 1200)) 14395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((res->floatval == ctxt->context->proximityPosition) && 14396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlXPathIsNaN(res->floatval))); /* MSC pbm Mark Vakoc !*/ 14397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 14398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(res->floatval == ctxt->context->proximityPosition); 14399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 14401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 14402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (res->nodesetval == NULL) 14403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(res->nodesetval->nodeNr != 0); 14405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 14406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((res->stringval != NULL) && (res->stringval[0] != 0)); 14407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XPTR_ENABLED 14408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET:{ 14409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlLocationSetPtr ptr = res->user; 14410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ptr == NULL) 14411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ptr->locNr != 0); 14413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 14416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project STRANGE 14417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING 14422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathTryStreamCompile: 14424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath context 14425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: the XPath expression 14426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to compile the XPath expression as a streamable subset. 14428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the compiled expression or NULL if failed to compile. 14430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlXPathCompExprPtr 14432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathTryStreamCompile(xmlXPathContextPtr ctxt, const xmlChar *str) { 14433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Optimization: use streaming patterns when the XPath expression can 14435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be compiled to a stream lookup 14436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPatternPtr stream; 14438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprPtr comp; 14439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictPtr dict = NULL; 14440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar **namespaces = NULL; 14441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNsPtr ns; 14442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j; 14443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((!xmlStrchr(str, '[')) && (!xmlStrchr(str, '(')) && 14445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlStrchr(str, '@'))) { 14446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *tmp; 14447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We don't try to handle expressions using the verbose axis 14450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * specifiers ("::"), just the simplied form at this point. 14451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Additionally, if there is no list of namespaces available and 14452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * there's a ":" in the expression, indicating a prefixed QName, 14453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then we won't try to compile either. xmlPatterncompile() needs 14454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to have a list of namespaces at compilation time in order to 14455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * compile prefixed name tests. 14456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlStrchr(str, ':'); 14458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tmp != NULL) && 14459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ctxt == NULL) || (ctxt->nsNr == 0) || (tmp[1] == ':'))) 14460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 14461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 14463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dict = ctxt->dict; 14464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nsNr > 0) { 14465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project namespaces = xmlMalloc(2 * (ctxt->nsNr + 1) * sizeof(xmlChar*)); 14466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (namespaces == NULL) { 14467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(ctxt, "allocating namespaces array\n"); 14468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 14469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0, j = 0; (j < ctxt->nsNr); j++) { 14471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ns = ctxt->namespaces[j]; 14472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project namespaces[i++] = ns->href; 14473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project namespaces[i++] = ns->prefix; 14474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project namespaces[i++] = NULL; 14476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project namespaces[i++] = NULL; 14477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream = xmlPatterncompile(str, dict, XML_PATTERN_XPATH, 14481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &namespaces[0]); 14482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (namespaces != NULL) { 14483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar **)namespaces); 14484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((stream != NULL) && (xmlPatternStreamable(stream) == 1)) { 14486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = xmlXPathNewCompExpr(); 14487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp == NULL) { 14488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathErrMemory(ctxt, "allocating streamable expression\n"); 14489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 14490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->stream = stream; 14492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->dict = dict; 14493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->dict) 14494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictReference(comp->dict); 14495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(comp); 14496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreePattern(stream); 14498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 14500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* XPATH_STREAMING */ 14502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 14504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCanRewriteDosExpression(xmlChar *expr) 14505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 14506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (expr == NULL) 14507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 14509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*expr == '/') && (*(++expr) == '/')) 14510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 14511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (*expr++); 14512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 14513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 14515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRewriteDOSExpression(xmlXPathCompExprPtr comp, xmlXPathStepOpPtr op) 14516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 14517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to rewrite "descendant-or-self::node()/foo" to an optimized 14519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * internal representation. 14520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) { 14522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((op->op == XPATH_OP_COLLECT /* 11 */) && 14523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlXPathAxisVal) op->value == AXIS_CHILD /* 4 */) && 14524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlXPathTestVal) op->value2 == NODE_TEST_NAME /* 5 */) && 14525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlXPathTypeVal) op->value3 == NODE_TYPE_NODE /* 0 */)) 14526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 14527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is a "child::foo" 14529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStepOpPtr prevop = &comp->steps[op->ch1]; 14531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((prevop->op == XPATH_OP_COLLECT /* 11 */) && 14533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (prevop->ch1 != -1) && 14534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlXPathAxisVal) prevop->value == 14535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project AXIS_DESCENDANT_OR_SELF) && 14536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (prevop->ch2 == -1) && 14537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlXPathTestVal) prevop->value2 == NODE_TEST_TYPE) && 14538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlXPathTypeVal) prevop->value3 == NODE_TYPE_NODE) && 14539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[prevop->ch1].op == XPATH_OP_ROOT)) 14540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 14541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is a "/descendant-or-self::node()" without predicates. 14543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Eliminate it. 14544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op->ch1 = prevop->ch1; 14546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op->rewriteType = XP_REWRITE_DOS_CHILD_ELEM; 14547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch1 != -1) 14550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRewriteDOSExpression(comp, &comp->steps[op->ch1]); 14551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->ch2 != -1) 14553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRewriteDOSExpression(comp, &comp->steps[op->ch2]); 14554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCtxtCompile: 14558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XPath context 14559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: the XPath expression 14560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an XPath expression 14562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathCompExprPtr resulting from the compilation or NULL. 14564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the caller has to free the object. 14565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompExprPtr 14567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCtxtCompile(xmlXPathContextPtr ctxt, const xmlChar *str) { 14568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathParserContextPtr pctxt; 14569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprPtr comp; 14570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING 14572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = xmlXPathTryStreamCompile(ctxt, str); 14573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp != NULL) 14574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(comp); 14575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathInit(); 14578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pctxt = xmlXPathNewParserContext(str, ctxt); 14580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (pctxt == NULL) 14581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return NULL; 14582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompileExpr(pctxt, 1); 14583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if( pctxt->error != XPATH_EXPRESSION_OK ) 14585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 14586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeParserContext(pctxt); 14587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 14588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*pctxt->cur != 0) { 14591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * aleksey: in some cases this line prints *second* error message 14593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (see bug #78858) and probably this should be fixed. 14594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * However, we are not sure that all error messages are printed 14595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * out in other places. It's not critical so we leave it as-is for now 14596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPatherror(pctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR); 14598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = NULL; 14599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 14600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = pctxt->comp; 14601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pctxt->comp = NULL; 14602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeParserContext(pctxt); 14604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp != NULL) { 14606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->expr = xmlStrdup(str); 14607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EVAL_COUNTS 14608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->string = xmlStrdup(str); 14609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->nb = 0; 14610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((comp->expr != NULL) && 14612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->nbStep > 2) && 14613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->last >= 0) && 14614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathCanRewriteDosExpression(comp->expr) == 1)) 14615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 14616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRewriteDOSExpression(comp, &comp->steps[comp->last]); 14617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(comp); 14620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompile: 14624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: the XPath expression 14625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an XPath expression 14627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathCompExprPtr resulting from the compilation or NULL. 14629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the caller has to free the object. 14630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompExprPtr 14632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompile(const xmlChar *str) { 14633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCtxtCompile(NULL, str)); 14634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompiledEvalInternal: 14638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the compiled XPath expression 14639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 14640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @resObj: the resulting XPath object or NULL 14641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @toBool: 1 if only a boolean result is requested 14642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled XPath expression in the given context. 14644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The caller has to free @resObj. 14645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL. 14647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the caller has to free the object. 14648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 14650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompiledEvalInternal(xmlXPathCompExprPtr comp, 14651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextPtr ctxt, 14652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr *resObj, 14653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int toBool) 14654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 14655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathParserContextPtr pctxt; 14656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef LIBXML_THREAD_ENABLED 14657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project static int reentance = 0; 14658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int res; 14660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_CTXT_NEG(ctxt) 14662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp == NULL) 14664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 14665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathInit(); 14666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef LIBXML_THREAD_ENABLED 14668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reentance++; 14669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (reentance > 1) 14670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathDisableOptimizer = 1; 14671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_EVAL_COUNTS 14674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->nb++; 14675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((comp->string != NULL) && (comp->nb > 100)) { 14676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "100 x %s\n", comp->string); 14677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->nb = 0; 14678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pctxt = xmlXPathCompParserContext(comp, ctxt); 14681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = xmlXPathRunEval(pctxt, toBool); 14682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (resObj) { 14684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (pctxt->value == NULL) { 14685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 14686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathCompiledEval: evaluation failed\n"); 14687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *resObj = NULL; 14688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 14689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *resObj = valuePop(pctxt); 14690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pop all remaining objects from the stack. 14695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (pctxt->valueNr > 0) { 14697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr tmp; 14698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int stack = 0; 14699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 14701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = valuePop(pctxt); 14702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != NULL) { 14703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stack++; 14704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt, tmp); 14705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (tmp != NULL); 14707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((stack != 0) && 14708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((toBool) || ((resObj) && (*resObj)))) 14709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 14710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 14711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathCompiledEval: %d objects left on the stack.\n", 14712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stack); 14713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((pctxt->error != XPATH_EXPRESSION_OK) && (resObj) && (*resObj)) { 14717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(*resObj); 14718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *resObj = NULL; 14719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pctxt->comp = NULL; 14721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeParserContext(pctxt); 14722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef LIBXML_THREAD_ENABLED 14723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project reentance--; 14724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(res); 14727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompiledEval: 14731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the compiled XPath expression 14732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the XPath context 14733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the Precompiled XPath expression in the given context. 14735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL. 14737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the caller has to free the object. 14738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 14740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompiledEval(xmlXPathCompExprPtr comp, xmlXPathContextPtr ctx) 14741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 14742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr res = NULL; 14743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompiledEvalInternal(comp, ctx, &res, 0); 14745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(res); 14746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathCompiledEvalToBoolean: 14750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the compiled XPath expression 14751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 14752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies the XPath boolean() function on the result of the given 14754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * compiled expression. 14755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the expression evaluated to true, 0 if to false and 14757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * -1 in API and internal errors. 14758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 14760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathCompiledEvalToBoolean(xmlXPathCompExprPtr comp, 14761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextPtr ctxt) 14762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 14763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlXPathCompiledEvalInternal(comp, ctxt, NULL, 1)); 14764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEvalExpr: 14768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 14769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse and evaluate an XPath expression in the given context, 14771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then push the result on the context stack 14772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 14774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEvalExpr(xmlXPathParserContextPtr ctxt) { 14775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING 14776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprPtr comp; 14777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) return; 14780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING 14782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = xmlXPathTryStreamCompile(ctxt->context, ctxt->base); 14783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp != NULL) { 14784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->comp != NULL) 14785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeCompExpr(ctxt->comp); 14786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->comp = comp; 14787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->cur != NULL) 14788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*ctxt->cur != 0) ctxt->cur++; 14789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 14790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 14792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompileExpr(ctxt, 1); 14793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 14794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In this scenario the expression string will sit in ctxt->base. 14795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->error == XPATH_EXPRESSION_OK) && 14797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->comp != NULL) && 14798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->base != NULL) && 14799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->comp->nbStep > 2) && 14800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->comp->last >= 0) && 14801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlXPathCanRewriteDosExpression((xmlChar *) ctxt->base) == 1)) 14802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 14803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRewriteDOSExpression(ctxt->comp, 14804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project &ctxt->comp->steps[ctxt->comp->last]); 14805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ERROR; 14808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRunEval(ctxt, 0); 14809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEval: 14813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: the XPath expression 14814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the XPath context 14815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the XPath Location Path in the given context. 14817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL. 14819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the caller has to free the object. 14820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 14822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEval(const xmlChar *str, xmlXPathContextPtr ctx) { 14823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathParserContextPtr ctxt; 14824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr res, tmp, init = NULL; 14825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int stack = 0; 14826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_CTXT(ctx) 14828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathInit(); 14830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = xmlXPathNewParserContext(str, ctx); 14832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 14833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return NULL; 14834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathEvalExpr(ctxt); 14835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->value == NULL) { 14837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 14838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathEval: evaluation failed\n"); 14839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = NULL; 14840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((*ctxt->cur != 0) && (ctxt->comp != NULL) 14841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XPATH_STREAMING 14842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (ctxt->comp->stream == NULL) 14843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 14844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ) { 14845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR); 14846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = NULL; 14847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 14848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(ctxt); 14849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 14852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = valuePop(ctxt); 14853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != NULL) { 14854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != init) 14855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stack++; 14856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctx, tmp); 14857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (tmp != NULL); 14859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((stack != 0) && (res != NULL)) { 14860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 14861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathEval: %d object left on the stack\n", 14862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stack); 14863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != XPATH_EXPRESSION_OK) { 14865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(res); 14866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = NULL; 14867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeParserContext(ctxt); 14870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(res); 14871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEvalExpression: 14875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: the XPath expression 14876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 14877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate the XPath expression in the given context. 14879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL. 14881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the caller has to free the object. 14882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathObjectPtr 14884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEvalExpression(const xmlChar *str, xmlXPathContextPtr ctxt) { 14885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathParserContextPtr pctxt; 14886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr res, tmp; 14887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int stack = 0; 14888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_CTXT(ctxt) 14890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathInit(); 14892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pctxt = xmlXPathNewParserContext(str, ctxt); 14894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (pctxt == NULL) 14895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return NULL; 14896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathEvalExpr(pctxt); 14897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*pctxt->cur != 0) || (pctxt->error != XPATH_EXPRESSION_OK)) { 14899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPatherror(pctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR); 14900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = NULL; 14901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 14902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project res = valuePop(pctxt); 14903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 14905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = valuePop(pctxt); 14906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != NULL) { 14907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt, tmp); 14908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stack++; 14909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (tmp != NULL); 14911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((stack != 0) && (res != NULL)) { 14912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 14913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlXPathEvalExpression: %d object left on the stack\n", 14914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stack); 14915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 14916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeParserContext(pctxt); 14917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(res); 14918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 14919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 14921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 14922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extra functions not pertaining to the XPath spec * 14923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 14924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 14925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 14926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathEscapeUriFunction: 14927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 14928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nargs: the number of arguments 14929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implement the escape-uri() XPath function 14931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string escape-uri(string $str, bool $escape-reserved) 14932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This function applies the URI escaping rules defined in section 2 of [RFC 14934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2396] to the string supplied as $uri-part, which typically represents all 14935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or part of a URI. The effect of the function is to replace any special 14936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * character in the string by an escape sequence of the form %xx%yy..., 14937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * where xxyy... is the hexadecimal representation of the octets used to 14938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * represent the character in UTF-8. 14939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The set of characters that are escaped depends on the setting of the 14941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * boolean argument $escape-reserved. 14942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If $escape-reserved is true, all characters are escaped other than lower 14944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * case letters a-z, upper case letters A-Z, digits 0-9, and the characters 14945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * referred to in [RFC 2396] as "marks": specifically, "-" | "_" | "." | "!" 14946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | "~" | "*" | "'" | "(" | ")". The "%" character itself is escaped only 14947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if it is not followed by two hexadecimal digits (that is, 0-9, a-f, and 14948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A-F). 14949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If $escape-reserved is false, the behavior differs in that characters 14951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * referred to in [RFC 2396] as reserved characters are not escaped. These 14952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * characters are ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ",". 14953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [RFC 2396] does not define whether escaped URIs should use lower case or 14955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * upper case for hexadecimal digits. To ensure that escaped URIs can be 14956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * compared using string comparison functions, this function must always use 14957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the upper-case letters A-F. 14958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Generally, $escape-reserved should be set to true when escaping a string 14960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * that is to form a single part of a URI, and to false when escaping an 14961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * entire URI or URI reference. 14962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In the case of non-ascii characters, the string is encoded according to 14964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * utf-8 and then converted according to RFC 2396. 14965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Examples 14967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xf:escape-uri ("gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles#ocean"), true()) 14968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns "gopher%3A%2F%2Fspinaltap.micro.umn.edu%2F00%2FWeather%2FCalifornia%2FLos%20Angeles%23ocean" 14969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xf:escape-uri ("gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles#ocean"), false()) 14970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns "gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles%23ocean" 14971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 14972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 14973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 14974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathEscapeUriFunction(xmlXPathParserContextPtr ctxt, int nargs) { 14975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr str; 14976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int escape_reserved; 14977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferPtr target; 14978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *cptr; 14979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar escape[4]; 14980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CHECK_ARITY(2); 14982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project escape_reserved = xmlXPathPopBoolean(ctxt); 14984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CAST_TO_STRING; 14986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = valuePop(ctxt); 14987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project target = xmlBufferCreate(); 14989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project escape[0] = '%'; 14991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project escape[3] = 0; 14992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (target) { 14994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (cptr = str->stringval; *cptr; cptr++) { 14995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*cptr >= 'A' && *cptr <= 'Z') || 14996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*cptr >= 'a' && *cptr <= 'z') || 14997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*cptr >= '0' && *cptr <= '9') || 14998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *cptr == '-' || *cptr == '_' || *cptr == '.' || 14999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *cptr == '!' || *cptr == '~' || *cptr == '*' || 15000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *cptr == '\''|| *cptr == '(' || *cptr == ')' || 15001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*cptr == '%' && 15002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((cptr[1] >= 'A' && cptr[1] <= 'F') || 15003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cptr[1] >= 'a' && cptr[1] <= 'f') || 15004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cptr[1] >= '0' && cptr[1] <= '9')) && 15005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((cptr[2] >= 'A' && cptr[2] <= 'F') || 15006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cptr[2] >= 'a' && cptr[2] <= 'f') || 15007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cptr[2] >= '0' && cptr[2] <= '9'))) || 15008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!escape_reserved && 15009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*cptr == ';' || *cptr == '/' || *cptr == '?' || 15010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *cptr == ':' || *cptr == '@' || *cptr == '&' || 15011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *cptr == '=' || *cptr == '+' || *cptr == '$' || 15012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *cptr == ','))) { 15013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferAdd(target, cptr, 1); 15014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 15015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*cptr >> 4) < 10) 15016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project escape[1] = '0' + (*cptr >> 4); 15017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 15018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project escape[1] = 'A' - 10 + (*cptr >> 4); 15019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*cptr & 0xF) < 10) 15020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project escape[2] = '0' + (*cptr & 0xF); 15021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 15022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project escape[2] = 'A' - 10 + (*cptr & 0xF); 15023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 15024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferAdd(target, &escape[0], 3); 15025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 15026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 15027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 15028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, 15029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferContent(target))); 15030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferFree(target); 15031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathReleaseObject(ctxt->context, str); 15032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 15033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 15034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 15035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlXPathRegisterAllFunctions: 15036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath context 15037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 15038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Registers all default XPath functions in this context 15039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 15040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 15041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlXPathRegisterAllFunctions(xmlXPathContextPtr ctxt) 15042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 15043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"boolean", 15044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathBooleanFunction); 15045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"ceiling", 15046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCeilingFunction); 15047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"count", 15048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCountFunction); 15049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"concat", 15050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathConcatFunction); 15051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"contains", 15052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContainsFunction); 15053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"id", 15054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathIdFunction); 15055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"false", 15056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFalseFunction); 15057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"floor", 15058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFloorFunction); 15059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"last", 15060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathLastFunction); 15061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"lang", 15062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathLangFunction); 15063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"local-name", 15064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathLocalNameFunction); 15065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"not", 15066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNotFunction); 15067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"name", 15068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNameFunction); 15069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"namespace-uri", 15070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNamespaceURIFunction); 15071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"normalize-space", 15072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNormalizeFunction); 15073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"number", 15074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathNumberFunction); 15075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"position", 15076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathPositionFunction); 15077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"round", 15078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRoundFunction); 15079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"string", 15080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStringFunction); 15081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"string-length", 15082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStringLengthFunction); 15083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"starts-with", 15084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathStartsWithFunction); 15085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"substring", 15086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathSubstringFunction); 15087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"substring-before", 15088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathSubstringBeforeFunction); 15089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"substring-after", 15090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathSubstringAfterFunction); 15091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"sum", 15092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathSumFunction); 15093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"true", 15094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathTrueFunction); 15095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFunc(ctxt, (const xmlChar *)"translate", 15096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathTranslateFunction); 15097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 15098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterFuncNS(ctxt, (const xmlChar *)"escape-uri", 15099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const xmlChar *)"http://www.w3.org/2002/08/xquery-functions", 15100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathEscapeUriFunction); 15101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 15102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 15103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_XPATH_ENABLED */ 15104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_xpath 15105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h" 15106