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