15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlreader.c: implements the xmlTextReader streaming node API 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XmlTextReader.Normalization Property won't be supported, since 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * it makes the parser non compliant to the XML recommendation 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See Copyright for the status of this software. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * daniel@veillard.com 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODOs: 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - XML Schemas validation 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IN_LIBXML 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_READER_ENABLED 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> /* for memset() only ! */ 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdarg.h> 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_CTYPE_H 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ctype.h> 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STDLIB_H 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h> 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlmemory.h> 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlIO.h> 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlreader.h> 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/parserInternals.h> 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/relaxng.h> 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlschemas.h> 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/uri.h> 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XINCLUDE_ENABLED 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xinclude.h> 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PATTERN_ENABLED 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/pattern.h> 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAX_ERR_MSG_SIZE 64000 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The following VA_COPY was coded following an example in 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the Samba project. It may not be sufficient for some 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * esoteric implementations of va_list (i.e. it may need 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * something involving a memcpy) but (hopefully) will be 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * sufficient for libxml2. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef VA_COPY 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #ifdef HAVE_VA_COPY 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #define VA_COPY(dest, src) va_copy(dest, src) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #else 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #ifdef HAVE___VA_COPY 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #define VA_COPY(dest,src) __va_copy(dest, src) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #else 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #define VA_COPY(dest,src) (dest) = (src) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #endif 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #endif 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #define DEBUG_CALLBACKS */ 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #define DEBUG_READER */ 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * macro to flag unimplemented blocks 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TODO \ 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, \ 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Unimplemented block at %s:%d\n", \ 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __FILE__, __LINE__); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_READER 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DUMP_READER xmlTextReaderDebug(reader); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DUMP_READER 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHUNK_SIZE 512 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The parser: maps the Text Reader API on top of the existing * 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parsing routines building a tree * 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_TEXTREADER_INPUT 1 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_TEXTREADER_CTXT 2 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef enum { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_TEXTREADER_NONE = -1, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_TEXTREADER_START= 0, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_TEXTREADER_ELEMENT= 1, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_TEXTREADER_END= 2, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_TEXTREADER_EMPTY= 3, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_TEXTREADER_BACKTRACK= 4, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_TEXTREADER_DONE= 5, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_TEXTREADER_ERROR= 6 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} xmlTextReaderState; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef enum { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_TEXTREADER_NOT_VALIDATE = 0, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_TEXTREADER_VALIDATE_DTD = 1, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_TEXTREADER_VALIDATE_RNG = 2, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_TEXTREADER_VALIDATE_XSD = 4 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} xmlTextReaderValidate; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlTextReader { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mode; /* the parsing mode */ 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr doc; /* when walking an existing doc */ 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidate validate;/* is there any validation */ 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int allocs; /* what structure were deallocated */ 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderState state; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserCtxtPtr ctxt; /* the parser context */ 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSAXHandlerPtr sax; /* the parser SAX callbacks */ 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserInputBufferPtr input; /* the input */ 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) startElementSAXFunc startElement;/* initial SAX callbacks */ 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) endElementSAXFunc endElement; /* idem */ 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) startElementNsSAX2Func startElementNs;/* idem */ 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) endElementNsSAX2Func endElementNs; /* idem */ 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) charactersSAXFunc characters; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cdataBlockSAXFunc cdataBlock; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int base; /* base of the segment in the input */ 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int cur; /* current position in the input */ 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; /* current node */ 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr curnode;/* current attribute node */ 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int depth; /* depth of the current node */ 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr faketext;/* fake xmlNs chld */ 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int preserve;/* preserve the resulting document */ 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferPtr buffer; /* used to return const xmlChar * */ 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDictPtr dict; /* the context dictionnary */ 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* entity stack when traversing entities content */ 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr ent; /* Current Entity Ref Node */ 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int entNr; /* Depth of the entities stack */ 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int entMax; /* Max depth of the entities stack */ 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr *entTab; /* array of entities */ 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* error handling */ 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderErrorFunc errorFunc; /* callback function */ 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *errorFuncArg; /* callback function user argument */ 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Handling of RelaxNG validation */ 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGPtr rngSchemas; /* The Relax NG schemas */ 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGValidCtxtPtr rngValidCtxt;/* The Relax NG validation context */ 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rngValidErrors;/* The number of errors detected */ 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr rngFullNode; /* the node if RNG not progressive */ 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Handling of Schemas validation */ 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaPtr xsdSchemas; /* The Schemas schemas */ 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaValidCtxtPtr xsdValidCtxt;/* The Schemas validation context */ 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int xsdPreserveCtxt; /* 1 if the context was provided by the user */ 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int xsdValidErrors;/* The number of errors detected */ 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaSAXPlugPtr xsdPlug; /* the schemas plug in SAX pipeline */ 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XINCLUDE_ENABLED 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Handling of XInclude processing */ 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int xinclude; /* is xinclude asked for */ 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * xinclude_name; /* the xinclude name from dict */ 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeCtxtPtr xincctxt; /* the xinclude context */ 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int in_xinclude; /* counts for xinclude */ 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PATTERN_ENABLED 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int patternNr; /* number of preserve patterns */ 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int patternMax; /* max preserve patterns */ 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlPatternPtr *patternTab; /* array of preserve patterns */ 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int preserves; /* level of preserves */ 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int parserFlags; /* the set of options set */ 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Structured error handling */ 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlStructuredErrorFunc sErrorFunc; /* callback function */ 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NODE_IS_EMPTY 0x1 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NODE_IS_PRESERVED 0x2 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NODE_IS_SPRESERVED 0x4 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * CONSTSTR: 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Macro used to return an interned string 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONSTSTR(str) xmlDictLookup(reader->dict, (str), -1) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONSTQSTR(p, str) xmlDictQLookup(reader->dict, (p), (str)) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlTextReaderReadTree(xmlTextReaderPtr reader); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlTextReaderNextTree(xmlTextReaderPtr reader); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Our own version of the freeing routines as we recycle nodes * 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DICT_FREE: 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str: a string 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free a string if it is not owned by the "dict" dictionnary in the 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * current scope 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DICT_FREE(str) \ 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((str) && ((!dict) || \ 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlDictOwns(dict, (const xmlChar *)(str)) == 0))) \ 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree((char *)(str)); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void xmlTextReaderFreeNode(xmlTextReaderPtr reader, xmlNodePtr cur); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void xmlTextReaderFreeNodeList(xmlTextReaderPtr reader, xmlNodePtr cur); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFreeID: 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @not: A id 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocate the memory used by an id definition 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFreeID(xmlIDPtr id) { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDictPtr dict = NULL; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id == NULL) return; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id->doc != NULL) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict = id->doc->dict; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id->value != NULL) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DICT_FREE(id->value) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(id); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderRemoveID: 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: the document 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @attr: the attribute 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Remove the given attribute from the ID table maintained internally. 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns -1 if the lookup failed and 0 otherwise 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderRemoveID(xmlDocPtr doc, xmlAttrPtr attr) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlIDTablePtr table; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlIDPtr id; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *ID; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc == NULL) return(-1); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (attr == NULL) return(-1); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) table = (xmlIDTablePtr) doc->ids; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (table == NULL) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID = xmlNodeListGetString(doc, attr->children, 1); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ID == NULL) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id = xmlHashLookup(table, ID); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ID); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id == NULL || id->attr != attr) { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id->name = attr->name; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id->attr = NULL; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderFreeProp: 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur: the node 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free a node. 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderFreeProp(xmlTextReaderPtr reader, xmlAttrPtr cur) { 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDictPtr dict; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict = reader->ctxt->dict; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) return; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue)) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDeregisterNodeDefaultValue((xmlNodePtr) cur); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Check for ID removal -> leading to invalid references ! */ 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->parent != NULL) && (cur->parent->doc != NULL) && 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((cur->parent->doc->intSubset != NULL) || 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->parent->doc->extSubset != NULL))) { 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlIsID(cur->parent->doc, cur->parent, cur)) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderRemoveID(cur->parent->doc, cur); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->children != NULL) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderFreeNodeList(reader, cur->children); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DICT_FREE(cur->name); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader != NULL) && (reader->ctxt != NULL) && 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->ctxt->freeAttrsNr < 100)) { 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->next = reader->ctxt->freeAttrs; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->freeAttrs = cur; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->freeAttrsNr++; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(cur); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderFreePropList: 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur: the first property in the list 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free a property and all its siblings, all the children are freed too. 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderFreePropList(xmlTextReaderPtr reader, xmlAttrPtr cur) { 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAttrPtr next; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) return; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next = cur->next; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderFreeProp(reader, cur); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = next; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderFreeNodeList: 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur: the first node in the list 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free a node and all its siblings, this is a recursive behaviour, all 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the children are freed too. 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderFreeNodeList(xmlTextReaderPtr reader, xmlNodePtr cur) { 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr next; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDictPtr dict; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict = reader->ctxt->dict; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) return; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->type == XML_NAMESPACE_DECL) { 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeNsList((xmlNsPtr) cur); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->type == XML_DOCUMENT_NODE) || 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_HTML_DOCUMENT_NODE)) { 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeDoc((xmlDocPtr) cur); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next = cur->next; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* unroll to speed up freeing the document */ 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->type != XML_DTD_NODE) { 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->children != NULL) && 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type != XML_ENTITY_REF_NODE)) { 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->children->parent == cur) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderFreeNodeList(reader, cur->children); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->children = NULL; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue)) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDeregisterNodeDefaultValue(cur); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((cur->type == XML_ELEMENT_NODE) || 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_XINCLUDE_START) || 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_XINCLUDE_END)) && 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->properties != NULL)) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderFreePropList(reader, cur->properties); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->content != (xmlChar *) &(cur->properties)) && 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type != XML_ELEMENT_NODE) && 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type != XML_XINCLUDE_START) && 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type != XML_XINCLUDE_END) && 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type != XML_ENTITY_REF_NODE)) { 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DICT_FREE(cur->content); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((cur->type == XML_ELEMENT_NODE) || 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_XINCLUDE_START) || 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_XINCLUDE_END)) && 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->nsDef != NULL)) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeNsList(cur->nsDef); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * we don't free element names here they are interned now 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->type != XML_TEXT_NODE) && 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type != XML_COMMENT_NODE)) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DICT_FREE(cur->name); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((cur->type == XML_ELEMENT_NODE) || 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_TEXT_NODE)) && 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader != NULL) && (reader->ctxt != NULL) && 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->ctxt->freeElemsNr < 100)) { 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->next = reader->ctxt->freeElems; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->freeElems = cur; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->freeElemsNr++; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(cur); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = next; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderFreeNode: 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur: the node 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free a node, this is a recursive behaviour, all the children are freed too. 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This doesn't unlink the child from the list, use xmlUnlinkNode() first. 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderFreeNode(xmlTextReaderPtr reader, xmlNodePtr cur) { 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDictPtr dict; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict = reader->ctxt->dict; 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->type == XML_DTD_NODE) { 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeDtd((xmlDtdPtr) cur); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->type == XML_NAMESPACE_DECL) { 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeNs((xmlNsPtr) cur); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->type == XML_ATTRIBUTE_NODE) { 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderFreeProp(reader, (xmlAttrPtr) cur); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->children != NULL) && 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type != XML_ENTITY_REF_NODE)) { 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->children->parent == cur) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderFreeNodeList(reader, cur->children); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->children = NULL; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue)) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDeregisterNodeDefaultValue(cur); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((cur->type == XML_ELEMENT_NODE) || 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_XINCLUDE_START) || 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_XINCLUDE_END)) && 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->properties != NULL)) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderFreePropList(reader, cur->properties); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->content != (xmlChar *) &(cur->properties)) && 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type != XML_ELEMENT_NODE) && 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type != XML_XINCLUDE_START) && 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type != XML_XINCLUDE_END) && 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type != XML_ENTITY_REF_NODE)) { 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DICT_FREE(cur->content); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((cur->type == XML_ELEMENT_NODE) || 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_XINCLUDE_START) || 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_XINCLUDE_END)) && 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->nsDef != NULL)) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeNsList(cur->nsDef); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * we don't free names here they are interned now 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->type != XML_TEXT_NODE) && 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type != XML_COMMENT_NODE)) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DICT_FREE(cur->name); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((cur->type == XML_ELEMENT_NODE) || 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_TEXT_NODE)) && 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader != NULL) && (reader->ctxt != NULL) && 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->ctxt->freeElemsNr < 100)) { 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->next = reader->ctxt->freeElems; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->freeElems = cur; 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->freeElemsNr++; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(cur); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderFreeIDTable: 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @table: An id table 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocate the memory used by an ID hash table. 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderFreeIDTable(xmlIDTablePtr table) { 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashFree(table, (xmlHashDeallocator) xmlFreeID); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderFreeDoc: 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur: pointer to the document 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free up all the structures used by a document, tree included. 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderFreeDoc(xmlTextReaderPtr reader, xmlDocPtr cur) { 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDtdPtr extSubset, intSubset; 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) return; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue)) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDeregisterNodeDefaultValue((xmlNodePtr) cur); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do this before freeing the children list to avoid ID lookups 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->ids != NULL) xmlTextReaderFreeIDTable((xmlIDTablePtr) cur->ids); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->ids = NULL; 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->refs != NULL) xmlFreeRefTable((xmlRefTablePtr) cur->refs); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->refs = NULL; 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extSubset = cur->extSubset; 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) intSubset = cur->intSubset; 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (intSubset == extSubset) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extSubset = NULL; 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extSubset != NULL) { 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlUnlinkNode((xmlNodePtr) cur->extSubset); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->extSubset = NULL; 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeDtd(extSubset); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (intSubset != NULL) { 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlUnlinkNode((xmlNodePtr) cur->intSubset); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->intSubset = NULL; 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeDtd(intSubset); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->children != NULL) xmlTextReaderFreeNodeList(reader, cur->children); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->version != NULL) xmlFree((char *) cur->version); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->name != NULL) xmlFree((char *) cur->name); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->encoding != NULL) xmlFree((char *) cur->encoding); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->oldNs != NULL) xmlFreeNsList(cur->oldNs); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->URL != NULL) xmlFree((char *) cur->URL); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->dict != NULL) xmlDictFree(cur->dict); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(cur); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The reader core parser * 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_READER 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderDebug(xmlTextReaderPtr reader) { 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (reader->ctxt == NULL)) { 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "xmlTextReader NULL\n"); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "xmlTextReader: state %d depth %d ", 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state, reader->depth); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) { 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "node = NULL\n"); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "node %s\n", reader->node->name); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, " input: base %d, cur %d, depth %d: ", 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->base, reader->cur, reader->ctxt->nodeNr); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->input->buffer == NULL) { 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "buffer is NULL\n"); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DEBUG_ENABLED 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDebugDumpString(stderr, 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &reader->input->buffer->content[reader->cur]); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "\n"); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderEntPush: 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: the entity reference node 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pushes a new entity reference node on top of the entities stack 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of error, the index in the stack otherwise 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderEntPush(xmlTextReaderPtr reader, xmlNodePtr value) 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->entMax <= 0) { 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->entMax = 10; 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->entTab = (xmlNodePtr *) xmlMalloc(reader->entMax * 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(reader->entTab[0])); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->entTab == NULL) { 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "xmlMalloc failed !\n"); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->entNr >= reader->entMax) { 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->entMax *= 2; 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->entTab = 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlNodePtr *) xmlRealloc(reader->entTab, 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->entMax * 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(reader->entTab[0])); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->entTab == NULL) { 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "xmlRealloc failed !\n"); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->entTab[reader->entNr] = value; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ent = value; 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (reader->entNr++); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderEntPop: 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pops the top element entity from the entities stack 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the entity just removed 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNodePtr 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderEntPop(xmlTextReaderPtr reader) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr ret; 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->entNr <= 0) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->entNr--; 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->entNr > 0) 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ent = reader->entTab[reader->entNr - 1]; 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ent = NULL; 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = reader->entTab[reader->entNr]; 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->entTab[reader->entNr] = NULL; 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderStartElement: 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx: the user data (XML parser context) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @fullname: The element name, including namespace prefix 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @atts: An array of name/value attributes pairs, NULL terminated 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * called when an opening tag has been processed. 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderStartElement(void *ctx, const xmlChar *fullname, 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar **atts) { 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderPtr reader = ctxt->_private; 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_CALLBACKS 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("xmlTextReaderStartElement(%s)\n", fullname); 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader != NULL) && (reader->startElement != NULL)) { 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->startElement(ctx, fullname, atts); 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->node != NULL) && (ctxt->input != NULL) && 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->input->cur != NULL) && (ctxt->input->cur[0] == '/') && 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->input->cur[1] == '>')) 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->node->extra = NODE_IS_EMPTY; 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader != NULL) 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_ELEMENT; 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderEndElement: 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx: the user data (XML parser context) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @fullname: The element name, including namespace prefix 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * called when an ending tag has been processed. 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderEndElement(void *ctx, const xmlChar *fullname) { 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderPtr reader = ctxt->_private; 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_CALLBACKS 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("xmlTextReaderEndElement(%s)\n", fullname); 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader != NULL) && (reader->endElement != NULL)) { 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->endElement(ctx, fullname); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderStartElementNs: 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx: the user data (XML parser context) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @localname: the local name of the element 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @prefix: the element namespace prefix if available 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URI: the element namespace name if available 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nb_namespaces: number of namespace definitions on that node 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @namespaces: pointer to the array of prefix/URI pairs namespace definitions 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nb_attributes: the number of attributes on that node 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * nb_defaulted: the number of defaulted attributes. 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @attributes: pointer to the array of (localname/prefix/URI/value/end) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * attribute values. 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * called when an opening tag has been processed. 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderStartElementNs(void *ctx, 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *localname, 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *prefix, 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *URI, 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nb_namespaces, 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar **namespaces, 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nb_attributes, 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nb_defaulted, 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar **attributes) 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderPtr reader = ctxt->_private; 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_CALLBACKS 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("xmlTextReaderStartElementNs(%s)\n", localname); 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader != NULL) && (reader->startElementNs != NULL)) { 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->startElementNs(ctx, localname, prefix, URI, nb_namespaces, 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) namespaces, nb_attributes, nb_defaulted, 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attributes); 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->node != NULL) && (ctxt->input != NULL) && 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->input->cur != NULL) && (ctxt->input->cur[0] == '/') && 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->input->cur[1] == '>')) 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->node->extra = NODE_IS_EMPTY; 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader != NULL) 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_ELEMENT; 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderEndElementNs: 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx: the user data (XML parser context) 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @localname: the local name of the element 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @prefix: the element namespace prefix if available 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URI: the element namespace name if available 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * called when an ending tag has been processed. 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderEndElementNs(void *ctx, 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * localname, 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * prefix, 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * URI) 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderPtr reader = ctxt->_private; 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_CALLBACKS 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("xmlTextReaderEndElementNs(%s)\n", localname); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader != NULL) && (reader->endElementNs != NULL)) { 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->endElementNs(ctx, localname, prefix, URI); 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderCharacters: 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx: the user data (XML parser context) 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ch: a xmlChar string 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len: the number of xmlChar 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * receiving some chars from the parser. 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderCharacters(void *ctx, const xmlChar *ch, int len) 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderPtr reader = ctxt->_private; 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_CALLBACKS 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("xmlTextReaderCharacters()\n"); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader != NULL) && (reader->characters != NULL)) { 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->characters(ctx, ch, len); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderCDataBlock: 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx: the user data (XML parser context) 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: The pcdata content 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len: the block length 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * called when a pcdata block has been parsed 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderCDataBlock(void *ctx, const xmlChar *ch, int len) 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderPtr reader = ctxt->_private; 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_CALLBACKS 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("xmlTextReaderCDataBlock()\n"); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader != NULL) && (reader->cdataBlock != NULL)) { 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->cdataBlock(ctx, ch, len); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderPushData: 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Push data down the progressive parser until a significant callback 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * got raised. 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns -1 in case of failure, 0 otherwise 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderPushData(xmlTextReaderPtr reader) { 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferPtr inbuf; 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int val, s; 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderState oldstate; 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->input == NULL) || (reader->input->buffer == NULL)) 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldstate = reader->state; 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_NONE; 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inbuf = reader->input->buffer; 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (reader->state == XML_TEXTREADER_NONE) { 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (inbuf->use < reader->cur + CHUNK_SIZE) { 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Refill the buffer unless we are at the end of the stream 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->mode != XML_TEXTREADER_MODE_EOF) { 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = xmlParserInputBufferRead(reader->input, 4096); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((val == 0) && 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (inbuf->alloc == XML_BUFFER_ALLOC_IMMUTABLE)) { 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (inbuf->use == reader->cur) { 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->mode = XML_TEXTREADER_MODE_EOF; 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = oldstate; 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (val < 0) { 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->mode = XML_TEXTREADER_MODE_EOF; 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = oldstate; 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((oldstate != XML_TEXTREADER_START) || 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->ctxt->myDoc != NULL)) 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(val); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (val == 0) { 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* mark the end of the stream and process the remains */ 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->mode = XML_TEXTREADER_MODE_EOF; 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse by block of CHUNK_SIZE bytes, various tests show that 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * it's the best tradeoff at least on a 1.2GH Duron 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (inbuf->use >= reader->cur + CHUNK_SIZE) { 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = xmlParseChunk(reader->ctxt, 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const char *) &inbuf->content[reader->cur], 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHUNK_SIZE, 0); 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->cur += CHUNK_SIZE; 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((val != 0) || (reader->ctxt->wellFormed == 0)) 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s = inbuf->use - reader->cur; 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = xmlParseChunk(reader->ctxt, 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const char *) &inbuf->content[reader->cur], 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s, 0); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->cur += s; 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((val != 0) || (reader->ctxt->wellFormed == 0)) 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Discard the consumed input when needed and possible 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->mode == XML_TEXTREADER_MODE_INTERACTIVE) { 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (inbuf->alloc != XML_BUFFER_ALLOC_IMMUTABLE) { 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->cur >= 4096) && 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (inbuf->use - reader->cur <= CHUNK_SIZE)) { 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = xmlBufferShrink(inbuf, reader->cur); 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (val >= 0) { 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->cur -= val; 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * At the end of the stream signal that the work is done to the Push 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parser. 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (reader->mode == XML_TEXTREADER_MODE_EOF) { 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->state != XML_TEXTREADER_DONE) { 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s = inbuf->use - reader->cur; 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = xmlParseChunk(reader->ctxt, 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const char *) &inbuf->content[reader->cur], 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s, 1); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->cur = inbuf->use; 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_DONE; 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((val != 0) || (reader->ctxt->wellFormed == 0)) 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = oldstate; 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_REGEXP_ENABLED 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderValidatePush: 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Push the current node for validation 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderValidatePush(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) { 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node = reader->node; 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_VALID_ENABLED 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->validate == XML_TEXTREADER_VALIDATE_DTD) && 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->ctxt != NULL) && (reader->ctxt->validate == 1)) { 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node->ns == NULL) || (node->ns->prefix == NULL)) { 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->valid &= xmlValidatePushElement(&reader->ctxt->vctxt, 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->myDoc, node, node->name); 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO use the BuildQName interface */ 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *qname; 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) qname = xmlStrdup(node->ns->prefix); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) qname = xmlStrcat(qname, BAD_CAST ":"); 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) qname = xmlStrcat(qname, node->name); 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->valid &= xmlValidatePushElement(&reader->ctxt->vctxt, 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->myDoc, node, qname); 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (qname != NULL) 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(qname); 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_VALID_ENABLED */ 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->validate == XML_TEXTREADER_VALIDATE_RNG) && 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->rngValidCtxt != NULL)) { 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->rngFullNode != NULL) return; 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidatePushElement(reader->rngValidCtxt, 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->myDoc, 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node); 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * this element requires a full tree 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = xmlTextReaderExpand(reader); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node == NULL) { 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)printf("Expand failed !\n"); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidateFullElement(reader->rngValidCtxt, 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->myDoc, 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->rngFullNode = node; 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 1) 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->rngValidErrors++; 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderValidateCData: 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @data: pointer to the CData 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len: lenght of the CData block in bytes. 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Push some CData for validation 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderValidateCData(xmlTextReaderPtr reader, 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *data, int len) { 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_VALID_ENABLED 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->validate == XML_TEXTREADER_VALIDATE_DTD) && 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->ctxt != NULL) && (reader->ctxt->validate == 1)) { 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->valid &= xmlValidatePushCData(&reader->ctxt->vctxt, 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data, len); 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_VALID_ENABLED */ 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->validate == XML_TEXTREADER_VALIDATE_RNG) && 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->rngValidCtxt != NULL)) { 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->rngFullNode != NULL) return; 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidatePushCData(reader->rngValidCtxt, data, len); 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 1) 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->rngValidErrors++; 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderValidatePop: 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pop the current node from validation 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderValidatePop(xmlTextReaderPtr reader) { 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node = reader->node; 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_VALID_ENABLED 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->validate == XML_TEXTREADER_VALIDATE_DTD) && 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->ctxt != NULL) && (reader->ctxt->validate == 1)) { 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node->ns == NULL) || (node->ns->prefix == NULL)) { 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->valid &= xmlValidatePopElement(&reader->ctxt->vctxt, 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->myDoc, node, node->name); 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO use the BuildQName interface */ 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *qname; 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) qname = xmlStrdup(node->ns->prefix); 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) qname = xmlStrcat(qname, BAD_CAST ":"); 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) qname = xmlStrcat(qname, node->name); 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->valid &= xmlValidatePopElement(&reader->ctxt->vctxt, 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->myDoc, node, qname); 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (qname != NULL) 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(qname); 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_VALID_ENABLED */ 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->validate == XML_TEXTREADER_VALIDATE_RNG) && 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->rngValidCtxt != NULL)) { 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->rngFullNode != NULL) { 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node == reader->rngFullNode) 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->rngFullNode = NULL; 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlRelaxNGValidatePopElement(reader->rngValidCtxt, 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->myDoc, 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node); 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 1) 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->rngValidErrors++; 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderValidateEntity: 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle the validation when an entity reference is encountered and 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * entity substitution is not activated. As a result the parser interface 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * must walk through the entity and do the validation calls 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderValidateEntity(xmlTextReaderPtr reader) { 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr oldnode = reader->node; 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node = reader->node; 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserCtxtPtr ctxt = reader->ctxt; 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->type == XML_ENTITY_REF_NODE) { 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Case where the underlying tree is not availble, lookup the entity 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and walk it. 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node->children == NULL) && (ctxt->sax != NULL) && 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->sax->getEntity != NULL)) { 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node->children = (xmlNodePtr) 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->sax->getEntity(ctxt, node->name); 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node->children != NULL) && 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->children->type == XML_ENTITY_DECL) && 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->children->children != NULL)) { 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderEntPush(reader, node); 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = node->children->children; 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The error has probably be raised already. 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node == oldnode) 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = node->next; 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_REGEXP_ENABLED 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (node->type == XML_ELEMENT_NODE) { 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node = node; 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidatePush(reader); 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((node->type == XML_TEXT_NODE) || 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->type == XML_CDATA_SECTION_NODE)) { 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidateCData(reader, node->content, 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlStrlen(node->content)); 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * go to next node 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->children != NULL) { 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = node->children; 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (node->type == XML_ELEMENT_NODE) { 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidatePop(reader); 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->next != NULL) { 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = node->next; 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = node->parent; 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->type == XML_ELEMENT_NODE) { 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr tmp; 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->entNr == 0) { 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((tmp = node->last) != NULL) { 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((tmp->extra & NODE_IS_PRESERVED) == 0) { 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlUnlinkNode(tmp); 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderFreeNode(reader, tmp); 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node = node; 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidatePop(reader); 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node->type == XML_ENTITY_DECL) && 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->ent != NULL) && (reader->ent->children == node)) { 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = xmlTextReaderEntPop(reader); 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node == oldnode) 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->next != NULL) { 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = node->next; 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while ((node != NULL) && (node != oldnode)); 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while ((node != NULL) && (node != oldnode)); 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node = oldnode; 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_REGEXP_ENABLED */ 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderGetSuccessor: 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur: the current node 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get the successor of a node if available. 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the successor node or NULL 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNodePtr 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderGetSuccessor(xmlNodePtr cur) { 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) return(NULL) ; /* ERROR */ 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->next != NULL) return(cur->next) ; 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->parent; 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) break; 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->next != NULL) return(cur->next); 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (cur != NULL); 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(cur); 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderDoExpand: 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Makes sure that the current node is fully read as well as all its 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * descendant. It means the full DOM subtree must be available at the 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * end of the call. 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if the node was expanded successfully, 0 if there is no more 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * nodes to read, or -1 in case of error 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderDoExpand(xmlTextReaderPtr reader) { 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int val; 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (reader->node == NULL) || (reader->ctxt == NULL)) 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->ctxt->instate == XML_PARSER_EOF) return(1); 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlTextReaderGetSuccessor(reader->node) != NULL) 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->ctxt->nodeNr < reader->depth) 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->mode == XML_TEXTREADER_MODE_EOF) 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = xmlTextReaderPushData(reader); 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (val < 0){ 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->mode = XML_TEXTREADER_MODE_ERROR; 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while(reader->mode != XML_TEXTREADER_MODE_EOF); 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderCollectSiblings: 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the first child 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Traverse depth-first through all sibling nodes and their children 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * nodes and concatenate their content. This is an auxiliary function 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to xmlTextReaderReadString. 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a string containing the content, or NULL in case of error. 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlChar * 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderCollectSiblings(xmlNodePtr node) 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferPtr buffer; 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *ret; 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer = xmlBufferCreate(); 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buffer == NULL) 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for ( ; node != NULL; node = node->next) { 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (node->type) { 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_TEXT_NODE: 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_CDATA_SECTION_NODE: 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferCat(buffer, node->content); 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ELEMENT_NODE: { 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *tmp; 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlTextReaderCollectSiblings(node->children); 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferCat(buffer, tmp); 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(tmp); 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = buffer->content; 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer->content = NULL; 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferFree(buffer); 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderRead: 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Moves the position of the current instance to the next node in 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the stream, exposing its properties. 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if the node was read successfully, 0 if there is no more 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * nodes to read, or -1 in case of error 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderRead(xmlTextReaderPtr reader) { 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int val, olddepth = 0; 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderState oldstate = XML_TEXTREADER_START; 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr oldnode = NULL; 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->curnode = NULL; 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->doc != NULL) 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlTextReaderReadTree(reader)); 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->ctxt == NULL) 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->ctxt->wellFormed != 1) 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_READER 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "\nREAD "); 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DUMP_READER 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->mode == XML_TEXTREADER_MODE_INITIAL) { 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->mode = XML_TEXTREADER_MODE_INTERACTIVE; 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Initial state 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = xmlTextReaderPushData(reader); 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (val < 0){ 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->mode = XML_TEXTREADER_MODE_ERROR; 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_ERROR; 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while ((reader->ctxt->node == NULL) && 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((reader->mode != XML_TEXTREADER_MODE_EOF) && 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->state != XML_TEXTREADER_DONE))); 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->ctxt->node == NULL) { 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->ctxt->myDoc != NULL) { 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node = reader->ctxt->myDoc->children; 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL){ 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->mode = XML_TEXTREADER_MODE_ERROR; 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_ERROR; 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_ELEMENT; 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->ctxt->myDoc != NULL) { 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node = reader->ctxt->myDoc->children; 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node = reader->ctxt->nodeTab[0]; 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_ELEMENT; 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->depth = 0; 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->parseMode = XML_PARSE_READER; 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto node_found; 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldstate = reader->state; 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) olddepth = reader->ctxt->nodeNr; 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldnode = reader->node; 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)get_next_node: 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) { 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->mode == XML_TEXTREADER_MODE_EOF) 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If we are not backtracking on ancestors or examined nodes, 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * that the parser didn't finished or that we arent at the end 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of stream, continue processing. 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((reader->node != NULL) && (reader->node->next == NULL) && 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->ctxt->nodeNr == olddepth) && 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((oldstate == XML_TEXTREADER_BACKTRACK) || 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->children == NULL) || 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->type == XML_ENTITY_REF_NODE) || 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((reader->node->children != NULL) && 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->children->type == XML_TEXT_NODE) && 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->children->next == NULL)) || 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->type == XML_DTD_NODE) || 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->type == XML_DOCUMENT_NODE) || 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->type == XML_HTML_DOCUMENT_NODE)) && 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((reader->ctxt->node == NULL) || 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->ctxt->node == reader->node) || 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->ctxt->node == reader->node->parent)) && 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->ctxt->instate != XML_PARSER_EOF)) { 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = xmlTextReaderPushData(reader); 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (val < 0){ 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->mode = XML_TEXTREADER_MODE_ERROR; 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_ERROR; 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto node_end; 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (oldstate != XML_TEXTREADER_BACKTRACK) { 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->node->children != NULL) && 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->type != XML_ENTITY_REF_NODE) && 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->type != XML_XINCLUDE_START) && 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->type != XML_DTD_NODE)) { 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node = reader->node->children; 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->depth++; 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_ELEMENT; 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto node_found; 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node->next != NULL) { 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((oldstate == XML_TEXTREADER_ELEMENT) && 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->type == XML_ELEMENT_NODE) && 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->children == NULL) && 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((reader->node->extra & NODE_IS_EMPTY) == 0) 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XINCLUDE_ENABLED 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && (reader->in_xinclude <= 0) 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) { 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_END; 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto node_found; 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_REGEXP_ENABLED 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->validate) && 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->type == XML_ELEMENT_NODE)) 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidatePop(reader); 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_REGEXP_ENABLED */ 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->preserves > 0) && 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->extra & NODE_IS_SPRESERVED)) 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->preserves--; 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node = reader->node->next; 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_ELEMENT; 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Cleanup of the old node 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->preserves == 0) && 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XINCLUDE_ENABLED 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->in_xinclude == 0) && 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->entNr == 0) && 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->prev != NULL) && 13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (reader->node->prev->type != XML_DTD_NODE)) { 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr tmp = reader->node->prev; 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((tmp->extra & NODE_IS_PRESERVED) == 0) { 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlUnlinkNode(tmp); 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderFreeNode(reader, tmp); 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto node_found; 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((oldstate == XML_TEXTREADER_ELEMENT) && 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->type == XML_ELEMENT_NODE) && 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->children == NULL) && 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((reader->node->extra & NODE_IS_EMPTY) == 0)) {; 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_END; 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto node_found; 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_REGEXP_ENABLED 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->validate) && (reader->node->type == XML_ELEMENT_NODE)) 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidatePop(reader); 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_REGEXP_ENABLED */ 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->preserves > 0) && 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->extra & NODE_IS_SPRESERVED)) 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->preserves--; 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node = reader->node->parent; 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->node == NULL) || 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->type == XML_DOCUMENT_NODE) || 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DOCB_ENABLED 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->type == XML_DOCB_DOCUMENT_NODE) || 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->type == XML_HTML_DOCUMENT_NODE)) { 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->mode != XML_TEXTREADER_MODE_EOF) { 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = xmlParseChunk(reader->ctxt, "", 0, 1); 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_DONE; 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (val != 0) 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node = NULL; 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->depth = -1; 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Cleanup of the old node 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((oldnode != NULL) && (reader->preserves == 0) && 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XINCLUDE_ENABLED 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->in_xinclude == 0) && 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->entNr == 0) && 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (oldnode->type != XML_DTD_NODE) && 14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ((oldnode->extra & NODE_IS_PRESERVED) == 0)) { 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlUnlinkNode(oldnode); 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderFreeNode(reader, oldnode); 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto node_end; 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->preserves == 0) && 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XINCLUDE_ENABLED 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->in_xinclude == 0) && 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->entNr == 0) && 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->last != NULL) && 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((reader->node->last->extra & NODE_IS_PRESERVED) == 0)) { 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr tmp = reader->node->last; 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlUnlinkNode(tmp); 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderFreeNode(reader, tmp); 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->depth--; 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_BACKTRACK; 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)node_found: 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DUMP_READER 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If we are in the middle of a piece of CDATA make sure it's finished 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->node != NULL) && 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->next == NULL) && 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((reader->node->type == XML_TEXT_NODE) || 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->type == XML_CDATA_SECTION_NODE))) { 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlTextReaderExpand(reader) == NULL) 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XINCLUDE_ENABLED 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle XInclude if asked for 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->xinclude) && (reader->node != NULL) && 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->type == XML_ELEMENT_NODE) && 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->ns != NULL) && 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((xmlStrEqual(reader->node->ns->href, XINCLUDE_NS)) || 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(reader->node->ns->href, XINCLUDE_OLD_NS)))) { 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->xincctxt == NULL) { 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xincctxt = xmlXIncludeNewContext(reader->ctxt->myDoc); 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeSetFlags(reader->xincctxt, 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->parserFlags & (~XML_PARSE_NOXINCNODE)); 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * expand that node and process it 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlTextReaderExpand(reader) == NULL) 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeProcessNode(reader->xincctxt, reader->node); 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->node != NULL) && (reader->node->type == XML_XINCLUDE_START)) { 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->in_xinclude++; 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto get_next_node; 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->node != NULL) && (reader->node->type == XML_XINCLUDE_END)) { 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->in_xinclude--; 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto get_next_node; 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle entities enter and exit when in entity replacement mode 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->node != NULL) && 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->type == XML_ENTITY_REF_NODE) && 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->ctxt != NULL) && (reader->ctxt->replaceEntities == 1)) { 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Case where the underlying tree is not availble, lookup the entity 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and walk it. 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->node->children == NULL) && (reader->ctxt->sax != NULL) && 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->ctxt->sax->getEntity != NULL)) { 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node->children = (xmlNodePtr) 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->sax->getEntity(reader->ctxt, reader->node->name); 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->node->children != NULL) && 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->children->type == XML_ENTITY_DECL) && 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->children->children != NULL)) { 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderEntPush(reader, reader->node); 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node = reader->node->children->children; 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_REGEXP_ENABLED 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((reader->node != NULL) && 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->type == XML_ENTITY_REF_NODE) && 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->ctxt != NULL) && (reader->validate)) { 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidateEntity(reader); 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_REGEXP_ENABLED */ 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->node != NULL) && 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->type == XML_ENTITY_DECL) && 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->ent != NULL) && (reader->ent->children == reader->node)) { 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node = xmlTextReaderEntPop(reader); 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->depth++; 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto get_next_node; 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_REGEXP_ENABLED 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->validate) && (reader->node != NULL)) { 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node = reader->node; 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node->type == XML_ELEMENT_NODE) && 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((reader->state != XML_TEXTREADER_END) && 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->state != XML_TEXTREADER_BACKTRACK))) { 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidatePush(reader); 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((node->type == XML_TEXT_NODE) || 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->type == XML_CDATA_SECTION_NODE)) { 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidateCData(reader, node->content, 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlStrlen(node->content)); 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_REGEXP_ENABLED */ 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PATTERN_ENABLED 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->patternNr > 0) && (reader->state != XML_TEXTREADER_END) && 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->state != XML_TEXTREADER_BACKTRACK)) { 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0;i < reader->patternNr;i++) { 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlPatternMatch(reader->patternTab[i], reader->node) == 1) { 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderPreserve(reader); 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_PATTERN_ENABLED */ 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->validate == XML_TEXTREADER_VALIDATE_XSD) && 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->xsdValidErrors == 0) && 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->xsdValidCtxt != NULL)) { 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdValidErrors = !xmlSchemaIsValid(reader->xsdValidCtxt); 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_PATTERN_ENABLED */ 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)node_end: 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_DONE; 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderReadState: 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Gets the read state of the reader. 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the state value, or -1 in case of error 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderReadState(xmlTextReaderPtr reader) { 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(reader->mode); 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderExpand: 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reads the contents of the current node and the full subtree. It then makes 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the subtree available until the next xmlTextReaderRead() call 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a node pointer valid until the next xmlTextReaderRead() call 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or NULL in case of error. 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderExpand(xmlTextReaderPtr reader) { 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (reader->node == NULL)) 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->doc != NULL) 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(reader->node); 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->ctxt == NULL) 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlTextReaderDoExpand(reader) < 0) 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(reader->node); 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderNext: 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Skip to the node following the current one in document order while 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * avoiding the subtree if any. 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if the node was read successfully, 0 if there is no more 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * nodes to read, or -1 in case of error 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderNext(xmlTextReaderPtr reader) { 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr cur; 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->doc != NULL) 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlTextReaderNextTree(reader)); 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = reader->node; 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur == NULL) || (cur->type != XML_ELEMENT_NODE)) 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlTextReaderRead(reader)); 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->state == XML_TEXTREADER_END || reader->state == XML_TEXTREADER_BACKTRACK) 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlTextReaderRead(reader)); 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->extra & NODE_IS_EMPTY) 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlTextReaderRead(reader)); 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlTextReaderRead(reader); 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 1) 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (reader->node != cur); 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlTextReaderRead(reader)); 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_WRITER_ENABLED 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderReadInnerXml: 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reads the contents of the current node, including child nodes and markup. 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a string containing the XML content, or NULL if the current node 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is neither an element nor attribute, or has no child nodes. The 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * string must be deallocated by the caller. 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar * 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderReadInnerXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *resbuf; 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node, cur_node; 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferPtr buff, buff2; 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr doc; 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlTextReaderExpand(reader) == NULL) { 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = reader->doc; 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buff = xmlBufferCreate(); 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (cur_node = reader->node->children; cur_node != NULL; 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur_node = cur_node->next) { 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = xmlDocCopyNode(cur_node, doc, 1); 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buff2 = xmlBufferCreate(); 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlNodeDump(buff2, doc, node, 0, 0) == -1) { 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeNode(node); 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferFree(buff2); 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferFree(buff); 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferCat(buff, buff2->content); 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeNode(node); 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferFree(buff2); 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resbuf = buff->content; 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buff->content = NULL; 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferFree(buff); 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return resbuf; 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_WRITER_ENABLED 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderReadOuterXml: 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reads the contents of the current node, including child nodes and markup. 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a string containing the XML content, or NULL if the current node 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is neither an element nor attribute, or has no child nodes. The 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * string must be deallocated by the caller. 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar * 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderReadOuterXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *resbuf; 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferPtr buff; 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr doc; 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->node; 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = reader->doc; 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlTextReaderExpand(reader) == NULL) { 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = xmlDocCopyNode(node, doc, 1); 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buff = xmlBufferCreate(); 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlNodeDump(buff, doc, node, 0, 0) == -1) { 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeNode(node); 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferFree(buff); 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resbuf = buff->content; 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buff->content = NULL; 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeNode(node); 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferFree(buff); 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return resbuf; 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderReadString: 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reads the contents of an element or a text node as a string. 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a string containing the contents of the Element or Text node, 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or NULL if the reader is positioned on any other type of node. 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The string must be deallocated by the caller. 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar * 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderReadString(xmlTextReaderPtr reader) 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (reader->node == NULL)) 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = (reader->curnode != NULL) ? reader->curnode : reader->node; 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (node->type) { 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_TEXT_NODE: 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->content != NULL) 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlStrdup(node->content)); 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ELEMENT_NODE: 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlTextReaderDoExpand(reader) != -1) { 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return xmlTextReaderCollectSiblings(node->children); 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ATTRIBUTE_NODE: 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TODO 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderReadBase64: 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @array: a byte array to store the content. 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @offset: the zero-based index into array where the method should 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * begin to write. 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len: the number of bytes to write. 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reads and decodes the Base64 encoded contents of an element and 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * stores the result in a byte buffer. 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of bytes written to array, or zero if the current 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * instance is not positioned on an element or -1 in case of error. 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderReadBase64(xmlTextReaderPtr reader, 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char *array ATTRIBUTE_UNUSED, 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int offset ATTRIBUTE_UNUSED, 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int len ATTRIBUTE_UNUSED) { 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (reader->ctxt == NULL)) 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->ctxt->wellFormed != 1) 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->node == NULL) || (reader->node->type == XML_ELEMENT_NODE)) 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TODO 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderReadBinHex: 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @array: a byte array to store the content. 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @offset: the zero-based index into array where the method should 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * begin to write. 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len: the number of bytes to write. 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reads and decodes the BinHex encoded contents of an element and 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * stores the result in a byte buffer. 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of bytes written to array, or zero if the current 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * instance is not positioned on an element or -1 in case of error. 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderReadBinHex(xmlTextReaderPtr reader, 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char *array ATTRIBUTE_UNUSED, 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int offset ATTRIBUTE_UNUSED, 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int len ATTRIBUTE_UNUSED) { 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (reader->ctxt == NULL)) 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->ctxt->wellFormed != 1) 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->node == NULL) || (reader->node->type == XML_ELEMENT_NODE)) 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TODO 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Operating on a preparsed tree * 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderNextTree(xmlTextReaderPtr reader) 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->state == XML_TEXTREADER_END) 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) { 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->doc->children == NULL) { 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_END; 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node = reader->doc->children; 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_START; 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->state != XML_TEXTREADER_BACKTRACK) { 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Here removed traversal to child, because we want to skip the subtree, 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replace with traversal to sibling to skip subtree */ 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node->next != 0) { 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Move to sibling if present,skipping sub-tree */ 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node = reader->node->next; 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_START; 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* if reader->node->next is NULL mean no subtree for current node, 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) so need to move to sibling of parent node if present */ 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->node->type == XML_ELEMENT_NODE) || 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->type == XML_ATTRIBUTE_NODE)) { 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_BACKTRACK; 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This will move to parent if present */ 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderRead(reader); 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node->next != 0) { 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node = reader->node->next; 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_START; 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node->parent != 0) { 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node->parent->type == XML_DOCUMENT_NODE) { 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_END; 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node = reader->node->parent; 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->depth--; 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_BACKTRACK; 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Repeat process to move to sibling of parent node if present */ 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderNextTree(reader); 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_END; 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderReadTree: 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Moves the position of the current instance to the next node in 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the stream, exposing its properties. 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if the node was read successfully, 0 if there is no more 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * nodes to read, or -1 in case of error 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderReadTree(xmlTextReaderPtr reader) { 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->state == XML_TEXTREADER_END) 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)next_node: 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) { 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->doc->children == NULL) { 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_END; 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node = reader->doc->children; 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_START; 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto found_node; 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->state != XML_TEXTREADER_BACKTRACK) && 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->type != XML_DTD_NODE) && 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->type != XML_XINCLUDE_START) && 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->type != XML_ENTITY_REF_NODE)) { 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node->children != NULL) { 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node = reader->node->children; 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->depth++; 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_START; 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto found_node; 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node->type == XML_ATTRIBUTE_NODE) { 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_BACKTRACK; 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto found_node; 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node->next != NULL) { 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node = reader->node->next; 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_START; 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto found_node; 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node->parent != NULL) { 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->node->parent->type == XML_DOCUMENT_NODE) || 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->parent->type == XML_HTML_DOCUMENT_NODE)) { 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_END; 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node = reader->node->parent; 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->depth--; 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_BACKTRACK; 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto found_node; 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_END; 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)found_node: 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->node->type == XML_XINCLUDE_START) || 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->node->type == XML_XINCLUDE_END)) 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto next_node; 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderNextSibling: 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Skip to the node following the current one in document order while 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * avoiding the subtree if any. 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Currently implemented only for Readers built on a document 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if the node was read successfully, 0 if there is no more 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * nodes to read, or -1 in case of error 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderNextSibling(xmlTextReaderPtr reader) { 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->doc == NULL) { 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO */ 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->state == XML_TEXTREADER_END) 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlTextReaderNextTree(reader)); 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node->next != NULL) { 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node = reader->node->next; 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_START; 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Constructor and destructors * 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewTextReader: 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @input: the xmlParserInputBufferPtr used to read data 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URI: the URI information for the source if available 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create an xmlTextReader structure fed with @input 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new xmlTextReaderPtr or NULL in case of error 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderPtr 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewTextReader(xmlParserInputBufferPtr input, const char *URI) { 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderPtr ret; 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input == NULL) 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlMalloc(sizeof(xmlTextReader)); 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) { 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlNewTextReader : malloc failed\n"); 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(ret, 0, sizeof(xmlTextReader)); 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->doc = NULL; 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->entTab = NULL; 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->entMax = 0; 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->entNr = 0; 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->input = input; 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->buffer = xmlBufferCreateSize(100); 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret->buffer == NULL) { 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ret); 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlNewTextReader : malloc failed\n"); 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->sax = (xmlSAXHandler *) xmlMalloc(sizeof(xmlSAXHandler)); 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret->sax == NULL) { 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferFree(ret->buffer); 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ret); 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlNewTextReader : malloc failed\n"); 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSAXVersion(ret->sax, 2); 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->startElement = ret->sax->startElement; 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->sax->startElement = xmlTextReaderStartElement; 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->endElement = ret->sax->endElement; 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->sax->endElement = xmlTextReaderEndElement; 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SAX1_ENABLED 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret->sax->initialized == XML_SAX2_MAGIC) { 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_SAX1_ENABLED */ 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->startElementNs = ret->sax->startElementNs; 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->sax->startElementNs = xmlTextReaderStartElementNs; 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->endElementNs = ret->sax->endElementNs; 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->sax->endElementNs = xmlTextReaderEndElementNs; 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SAX1_ENABLED 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->startElementNs = NULL; 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->endElementNs = NULL; 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_SAX1_ENABLED */ 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->characters = ret->sax->characters; 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->sax->characters = xmlTextReaderCharacters; 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->sax->ignorableWhitespace = xmlTextReaderCharacters; 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->cdataBlock = ret->sax->cdataBlock; 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->sax->cdataBlock = xmlTextReaderCDataBlock; 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->mode = XML_TEXTREADER_MODE_INITIAL; 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->node = NULL; 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->curnode = NULL; 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret->input->buffer->use < 4) { 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserInputBufferRead(input, 4); 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret->input->buffer->use >= 4) { 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->ctxt = xmlCreatePushParserCtxt(ret->sax, NULL, 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const char *) ret->input->buffer->content, 4, URI); 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->base = 0; 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->cur = 4; 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->ctxt = xmlCreatePushParserCtxt(ret->sax, NULL, NULL, 0, URI); 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->base = 0; 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->cur = 0; 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret->ctxt == NULL) { 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlNewTextReader : malloc failed\n"); 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferFree(ret->buffer); 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ret->sax); 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ret); 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->ctxt->parseMode = XML_PARSE_READER; 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->ctxt->_private = ret; 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->ctxt->linenumbers = 1; 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->ctxt->dictNames = 1; 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->allocs = XML_TEXTREADER_CTXT; 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * use the parser dictionnary to allocate all elements and attributes names 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->ctxt->docdict = 1; 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->dict = ret->ctxt->dict; 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XINCLUDE_ENABLED 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->xinclude = 0; 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PATTERN_ENABLED 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->patternMax = 0; 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->patternTab = NULL; 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewTextReaderFilename: 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URI: the URI of the resource to process 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create an xmlTextReader structure fed with the resource at @URI 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new xmlTextReaderPtr or NULL in case of error 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderPtr 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewTextReaderFilename(const char *URI) { 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserInputBufferPtr input; 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderPtr ret; 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *directory = NULL; 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input = xmlParserInputBufferCreateFilename(URI, XML_CHAR_ENCODING_NONE); 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input == NULL) 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlNewTextReader(input, URI); 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) { 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeParserInputBuffer(input); 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->allocs |= XML_TEXTREADER_INPUT; 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret->ctxt->directory == NULL) 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) directory = xmlParserGetDirectory(URI); 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ret->ctxt->directory == NULL) && (directory != NULL)) 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->ctxt->directory = (char *) xmlStrdup((xmlChar *) directory); 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (directory != NULL) 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(directory); 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFreeTextReader: 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocate all the resources associated to the reader 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFreeTextReader(xmlTextReaderPtr reader) { 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->rngSchemas != NULL) { 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFree(reader->rngSchemas); 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->rngSchemas = NULL; 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->rngValidCtxt != NULL) { 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->rngValidCtxt = NULL; 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->xsdPlug != NULL) { 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaSAXUnplug(reader->xsdPlug); 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdPlug = NULL; 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->xsdValidCtxt != NULL) { 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (! reader->xsdPreserveCtxt) 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdValidCtxt = NULL; 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->xsdSchemas != NULL) { 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaFree(reader->xsdSchemas); 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdSchemas = NULL; 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XINCLUDE_ENABLED 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->xincctxt != NULL) 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeFreeContext(reader->xincctxt); 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PATTERN_ENABLED 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->patternTab != NULL) { 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0;i < reader->patternNr;i++) { 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->patternTab[i] != NULL) 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreePattern(reader->patternTab[i]); 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(reader->patternTab); 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->faketext != NULL) { 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeNode(reader->faketext); 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->ctxt != NULL) { 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->dict == reader->ctxt->dict) 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->dict = NULL; 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->ctxt->myDoc != NULL) { 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->preserve == 0) 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderFreeDoc(reader, reader->ctxt->myDoc); 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->myDoc = NULL; 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->ctxt->vctxt.vstateTab != NULL) && 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->ctxt->vctxt.vstateMax > 0)){ 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(reader->ctxt->vctxt.vstateTab); 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->vctxt.vstateTab = NULL; 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->vctxt.vstateMax = 0; 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->allocs & XML_TEXTREADER_CTXT) 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeParserCtxt(reader->ctxt); 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->sax != NULL) 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(reader->sax); 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->input != NULL) && (reader->allocs & XML_TEXTREADER_INPUT)) 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeParserInputBuffer(reader->input); 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->buffer != NULL) 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferFree(reader->buffer); 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->entTab != NULL) 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(reader->entTab); 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->dict != NULL) 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDictFree(reader->dict); 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(reader); 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Methods for XmlTextReader * 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderClose: 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This method releases any resources allocated by the current instance 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * changes the state to Closed and close any underlying input. 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 or -1 in case of error 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderClose(xmlTextReaderPtr reader) { 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node = NULL; 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->curnode = NULL; 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->mode = XML_TEXTREADER_MODE_CLOSED; 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->ctxt != NULL) { 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlStopParser(reader->ctxt); 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->ctxt->myDoc != NULL) { 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->preserve == 0) 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderFreeDoc(reader, reader->ctxt->myDoc); 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->myDoc = NULL; 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->input != NULL) && (reader->allocs & XML_TEXTREADER_INPUT)) { 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeParserInputBuffer(reader->input); 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->allocs -= XML_TEXTREADER_INPUT; 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderGetAttributeNo: 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @no: the zero-based index of the attribute relative to the containing element 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Provides the value of the attribute with the specified index relative 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to the containing element. 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a string containing the value of the specified attribute, or NULL 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in case of error. The string must be deallocated by the caller. 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar * 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderGetAttributeNo(xmlTextReaderPtr reader, int no) { 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *ret; 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAttrPtr cur; 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr ns; 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode != NULL) 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO: handle the xmlDecl */ 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node->type != XML_ELEMENT_NODE) 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = reader->node->nsDef; 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0;(i < no) && (ns != NULL);i++) { 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = ns->next; 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns != NULL) 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlStrdup(ns->href)); 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = reader->node->properties; 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (;i < no;i++) { 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO walk the DTD if present */ 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlNodeListGetString(reader->node->doc, cur->children, 1); 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) return(xmlStrdup((xmlChar *)"")); 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderGetAttribute: 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: the qualified name of the attribute. 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Provides the value of the attribute with the specified qualified name. 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a string containing the value of the specified attribute, or NULL 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in case of error. The string must be deallocated by the caller. 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar * 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderGetAttribute(xmlTextReaderPtr reader, const xmlChar *name) { 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *prefix = NULL; 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *localname; 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr ns; 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *ret = NULL; 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (name == NULL)) 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode != NULL) 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO: handle the xmlDecl */ 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node->type != XML_ELEMENT_NODE) 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) localname = xmlSplitQName2(name, &prefix); 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (localname == NULL) { 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Namespace default decl 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(name, BAD_CAST "xmlns")) { 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = reader->node->nsDef; 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (ns != NULL) { 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns->prefix == NULL) { 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlStrdup(ns->href)); 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = ns->next; 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlGetNoNsProp(reader->node, name)); 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Namespace default decl 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(prefix, BAD_CAST "xmlns")) { 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = reader->node->nsDef; 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (ns != NULL) { 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ns->prefix != NULL) && (xmlStrEqual(ns->prefix, localname))) { 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlStrdup(ns->href); 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = ns->next; 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = xmlSearchNs(reader->node->doc, reader->node, prefix); 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns != NULL) 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlGetNsProp(reader->node, localname, ns->href); 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(localname); 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prefix != NULL) 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(prefix); 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderGetAttributeNs: 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @localName: the local name of the attribute. 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @namespaceURI: the namespace URI of the attribute. 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Provides the value of the specified attribute 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a string containing the value of the specified attribute, or NULL 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in case of error. The string must be deallocated by the caller. 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar * 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderGetAttributeNs(xmlTextReaderPtr reader, const xmlChar *localName, 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *namespaceURI) { 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *prefix = NULL; 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr ns; 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (localName == NULL)) 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode != NULL) 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO: handle the xmlDecl */ 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node->type != XML_ELEMENT_NODE) 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(namespaceURI, BAD_CAST "http://www.w3.org/2000/xmlns/")) { 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (! xmlStrEqual(localName, BAD_CAST "xmlns")) { 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefix = BAD_CAST localName; 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = reader->node->nsDef; 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (ns != NULL) { 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((prefix == NULL && ns->prefix == NULL) || 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((ns->prefix != NULL) && (xmlStrEqual(ns->prefix, localName)))) { 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return xmlStrdup(ns->href); 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = ns->next; 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlGetNsProp(reader->node, localName, namespaceURI)); 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderGetRemainder: 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Method to get the remainder of the buffered XML. this method stops the 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parser, set its state to End Of File and return the input stream with 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * what is left that the parser did not use. 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The implementation is not good, the parser certainly procgressed past 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * what's left in reader->input, and there is an allocation problem. Best 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * would be to rewrite it differently. 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the xmlParserInputBufferPtr attached to the XML or NULL 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in case of error. 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserInputBufferPtr 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderGetRemainder(xmlTextReaderPtr reader) { 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserInputBufferPtr ret = NULL; 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node = NULL; 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->curnode = NULL; 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->mode = XML_TEXTREADER_MODE_EOF; 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->ctxt != NULL) { 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlStopParser(reader->ctxt); 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->ctxt->myDoc != NULL) { 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->preserve == 0) 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderFreeDoc(reader, reader->ctxt->myDoc); 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->myDoc = NULL; 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->allocs & XML_TEXTREADER_INPUT) { 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = reader->input; 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->input = NULL; 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->allocs -= XML_TEXTREADER_INPUT; 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Hum, one may need to duplicate the data structure because 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * without reference counting the input may be freed twice: 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - by the layer which allocated it. 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - by the layer to which would have been returned to. 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TODO 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderLookupNamespace: 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @prefix: the prefix whose namespace URI is to be resolved. To return 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the default namespace, specify NULL 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Resolves a namespace prefix in the scope of the current element. 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a string containing the namespace URI to which the prefix maps 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or NULL in case of error. The string must be deallocated by the caller. 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar * 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderLookupNamespace(xmlTextReaderPtr reader, const xmlChar *prefix) { 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr ns; 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = xmlSearchNs(reader->node->doc, reader->node, prefix); 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns == NULL) 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlStrdup(ns->href)); 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderMoveToAttributeNo: 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @no: the zero-based index of the attribute relative to the containing 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * element. 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Moves the position of the current instance to the attribute with 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the specified index relative to the containing element. 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 in case of success, -1 in case of error, 0 if not found 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderMoveToAttributeNo(xmlTextReaderPtr reader, int no) { 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAttrPtr cur; 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr ns; 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO: handle the xmlDecl */ 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node->type != XML_ELEMENT_NODE) 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->curnode = NULL; 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = reader->node->nsDef; 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0;(i < no) && (ns != NULL);i++) { 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = ns->next; 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns != NULL) { 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->curnode = (xmlNodePtr) ns; 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = reader->node->properties; 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (;i < no;i++) { 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO walk the DTD if present */ 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->curnode = (xmlNodePtr) cur; 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderMoveToAttribute: 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: the qualified name of the attribute. 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Moves the position of the current instance to the attribute with 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the specified qualified name. 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 in case of success, -1 in case of error, 0 if not found 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderMoveToAttribute(xmlTextReaderPtr reader, const xmlChar *name) { 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *prefix = NULL; 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *localname; 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr ns; 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAttrPtr prop; 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (name == NULL)) 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO: handle the xmlDecl */ 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node->type != XML_ELEMENT_NODE) 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) localname = xmlSplitQName2(name, &prefix); 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (localname == NULL) { 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Namespace default decl 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(name, BAD_CAST "xmlns")) { 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = reader->node->nsDef; 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (ns != NULL) { 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns->prefix == NULL) { 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->curnode = (xmlNodePtr) ns; 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = ns->next; 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prop = reader->node->properties; 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (prop != NULL) { 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * One need to have 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - same attribute names 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - and the attribute carrying that namespace 26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((xmlStrEqual(prop->name, name)) && 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((prop->ns == NULL) || (prop->ns->prefix == NULL))) { 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->curnode = (xmlNodePtr) prop; 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prop = prop->next; 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Namespace default decl 26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(prefix, BAD_CAST "xmlns")) { 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = reader->node->nsDef; 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (ns != NULL) { 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ns->prefix != NULL) && (xmlStrEqual(ns->prefix, localname))) { 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->curnode = (xmlNodePtr) ns; 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto found; 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = ns->next; 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto not_found; 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prop = reader->node->properties; 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (prop != NULL) { 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * One need to have 26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - same attribute names 26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - and the attribute carrying that namespace 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((xmlStrEqual(prop->name, localname)) && 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (prop->ns != NULL) && (xmlStrEqual(prop->ns->prefix, prefix))) { 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->curnode = (xmlNodePtr) prop; 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto found; 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prop = prop->next; 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)not_found: 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (localname != NULL) 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(localname); 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prefix != NULL) 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(prefix); 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)found: 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (localname != NULL) 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(localname); 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prefix != NULL) 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(prefix); 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderMoveToAttributeNs: 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @localName: the local name of the attribute. 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @namespaceURI: the namespace URI of the attribute. 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Moves the position of the current instance to the attribute with the 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * specified local name and namespace URI. 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 in case of success, -1 in case of error, 0 if not found 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderMoveToAttributeNs(xmlTextReaderPtr reader, 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *localName, const xmlChar *namespaceURI) { 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAttrPtr prop; 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr ns; 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *prefix = NULL; 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (localName == NULL) || (namespaceURI == NULL)) 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node->type != XML_ELEMENT_NODE) 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->node; 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(namespaceURI, BAD_CAST "http://www.w3.org/2000/xmlns/")) { 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (! xmlStrEqual(localName, BAD_CAST "xmlns")) { 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefix = BAD_CAST localName; 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = reader->node->nsDef; 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (ns != NULL) { 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((prefix == NULL && ns->prefix == NULL) || 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((ns->prefix != NULL) && (xmlStrEqual(ns->prefix, localName)))) { 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->curnode = (xmlNodePtr) ns; 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = ns->next; 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prop = node->properties; 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (prop != NULL) { 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * One need to have 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - same attribute names 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - and the attribute carrying that namespace 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(prop->name, localName) && 27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((prop->ns != NULL) && 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(prop->ns->href, namespaceURI)))) { 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->curnode = (xmlNodePtr) prop; 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prop = prop->next; 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderMoveToFirstAttribute: 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Moves the position of the current instance to the first attribute 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * associated with the current node. 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 in case of success, -1 in case of error, 0 if not found 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderMoveToFirstAttribute(xmlTextReaderPtr reader) { 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node->type != XML_ELEMENT_NODE) 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node->nsDef != NULL) { 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->curnode = (xmlNodePtr) reader->node->nsDef; 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node->properties != NULL) { 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->curnode = (xmlNodePtr) reader->node->properties; 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderMoveToNextAttribute: 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Moves the position of the current instance to the next attribute 27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * associated with the current node. 27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 in case of success, -1 in case of error, 0 if not found 27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderMoveToNextAttribute(xmlTextReaderPtr reader) { 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) 27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node->type != XML_ELEMENT_NODE) 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode == NULL) 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlTextReaderMoveToFirstAttribute(reader)); 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode->type == XML_NAMESPACE_DECL) { 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr ns = (xmlNsPtr) reader->curnode; 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns->next != NULL) { 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->curnode = (xmlNodePtr) ns->next; 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node->properties != NULL) { 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->curnode = (xmlNodePtr) reader->node->properties; 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((reader->curnode->type == XML_ATTRIBUTE_NODE) && 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->curnode->next != NULL)) { 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->curnode = reader->curnode->next; 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderMoveToElement: 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Moves the position of the current instance to the node that 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * contains the current Attribute node. 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 in case of success, -1 in case of error, 0 if not moved 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderMoveToElement(xmlTextReaderPtr reader) { 28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node->type != XML_ELEMENT_NODE) 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode != NULL) { 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->curnode = NULL; 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderReadAttributeValue: 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Parses an attribute value into one or more Text and EntityReference nodes. 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 in case of success, 0 if the reader was not positionned on an 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ttribute node or all the attribute values have been read, or -1 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in case of error. 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderReadAttributeValue(xmlTextReaderPtr reader) { 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode == NULL) 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode->type == XML_ATTRIBUTE_NODE) { 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode->children == NULL) 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->curnode = reader->curnode->children; 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (reader->curnode->type == XML_NAMESPACE_DECL) { 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr ns = (xmlNsPtr) reader->curnode; 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->faketext == NULL) { 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->faketext = xmlNewDocText(reader->node->doc, 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns->href); 28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->faketext->content != NULL) && 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->faketext->content != 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlChar *) &(reader->faketext->properties))) 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(reader->faketext->content); 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->faketext->content = xmlStrdup(ns->href); 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->curnode = reader->faketext; 28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode->next == NULL) 28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->curnode = reader->curnode->next; 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderConstEncoding: 28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Determine the encoding of the document being read. 28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a string containing the encoding of the document or NULL in 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * case of error. The string is deallocated with the reader. 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const xmlChar * 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderConstEncoding(xmlTextReaderPtr reader) { 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr doc = NULL; 28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->doc != NULL) 28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = reader->doc; 28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (reader->ctxt != NULL) 28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = reader->ctxt->myDoc; 28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc == NULL) 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc->encoding == NULL) 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(CONSTSTR(doc->encoding)); 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Acces API to the current node * 29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderAttributeCount: 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Provides the number of attributes of the current node 29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 i no attributes, -1 in case of error or the attribute count 29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderAttributeCount(xmlTextReaderPtr reader) { 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAttrPtr attr; 29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr ns; 29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; 29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) 29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode != NULL) 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->curnode; 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->node; 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->type != XML_ELEMENT_NODE) 29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->state == XML_TEXTREADER_END) || 29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->state == XML_TEXTREADER_BACKTRACK)) 29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attr = node->properties; 29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (attr != NULL) { 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret++; 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attr = attr->next; 29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = node->nsDef; 29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (ns != NULL) { 29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret++; 29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = ns->next; 29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderNodeType: 29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get the node type of the current node 29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reference: 29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * http://www.gnu.org/software/dotgnu/pnetlib-doc/System/Xml/XmlNodeType.html 29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the xmlNodeType of the current node or -1 in case of error 29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderNodeType(xmlTextReaderPtr reader) { 29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) 29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(XML_READER_TYPE_NONE); 29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode != NULL) 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->curnode; 29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->node; 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (node->type) { 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ELEMENT_NODE: 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->state == XML_TEXTREADER_END) || 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->state == XML_TEXTREADER_BACKTRACK)) 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(XML_READER_TYPE_END_ELEMENT); 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(XML_READER_TYPE_ELEMENT); 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_NAMESPACE_DECL: 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ATTRIBUTE_NODE: 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(XML_READER_TYPE_ATTRIBUTE); 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_TEXT_NODE: 29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlIsBlankNode(reader->node)) { 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlNodeGetSpacePreserve(reader->node)) 29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(XML_READER_TYPE_SIGNIFICANT_WHITESPACE); 29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(XML_READER_TYPE_WHITESPACE); 29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(XML_READER_TYPE_TEXT); 29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_CDATA_SECTION_NODE: 29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(XML_READER_TYPE_CDATA); 29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ENTITY_REF_NODE: 29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(XML_READER_TYPE_ENTITY_REFERENCE); 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ENTITY_NODE: 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(XML_READER_TYPE_ENTITY); 30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_PI_NODE: 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(XML_READER_TYPE_PROCESSING_INSTRUCTION); 30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_COMMENT_NODE: 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(XML_READER_TYPE_COMMENT); 30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCUMENT_NODE: 30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_HTML_DOCUMENT_NODE: 30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DOCB_ENABLED 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCB_DOCUMENT_NODE: 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(XML_READER_TYPE_DOCUMENT); 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCUMENT_FRAG_NODE: 30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(XML_READER_TYPE_DOCUMENT_FRAGMENT); 30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_NOTATION_NODE: 30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(XML_READER_TYPE_NOTATION); 30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCUMENT_TYPE_NODE: 30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DTD_NODE: 30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(XML_READER_TYPE_DOCUMENT_TYPE); 30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ELEMENT_DECL: 30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ATTRIBUTE_DECL: 30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ENTITY_DECL: 30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_XINCLUDE_START: 30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_XINCLUDE_END: 30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(XML_READER_TYPE_NONE); 30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderIsEmptyElement: 30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check if the current node is empty 30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if empty, 0 if not and -1 in case of error 30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderIsEmptyElement(xmlTextReaderPtr reader) { 30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (reader->node == NULL)) 30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node->type != XML_ELEMENT_NODE) 30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode != NULL) 30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node->children != NULL) 30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->state == XML_TEXTREADER_END) 30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->doc != NULL) 30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XINCLUDE_ENABLED 30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->in_xinclude > 0) 30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return((reader->node->extra & NODE_IS_EMPTY) != 0); 30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderLocalName: 30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The local name of the node. 30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the local name or NULL if not available, 30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if non NULL it need to be freed by the caller. 30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar * 30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderLocalName(xmlTextReaderPtr reader) { 30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; 30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (reader->node == NULL)) 30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode != NULL) 30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->curnode; 30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->node; 30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->type == XML_NAMESPACE_DECL) { 30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr ns = (xmlNsPtr) node; 30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns->prefix == NULL) 30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlStrdup(BAD_CAST "xmlns")); 30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlStrdup(ns->prefix)); 30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node->type != XML_ELEMENT_NODE) && 30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->type != XML_ATTRIBUTE_NODE)) 30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlTextReaderName(reader)); 30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlStrdup(node->name)); 30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderConstLocalName: 30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The local name of the node. 30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the local name or NULL if not available, the 30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * string will be deallocated with the reader. 30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const xmlChar * 31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderConstLocalName(xmlTextReaderPtr reader) { 31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; 31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (reader->node == NULL)) 31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode != NULL) 31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->curnode; 31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->node; 31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->type == XML_NAMESPACE_DECL) { 31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr ns = (xmlNsPtr) node; 31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns->prefix == NULL) 31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(CONSTSTR(BAD_CAST "xmlns")); 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ns->prefix); 31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node->type != XML_ELEMENT_NODE) && 31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->type != XML_ATTRIBUTE_NODE)) 31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlTextReaderConstName(reader)); 31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(node->name); 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderName: 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The qualified name of the node, equal to Prefix :LocalName. 31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the local name or NULL if not available, 31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if non NULL it need to be freed by the caller. 31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar * 31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderName(xmlTextReaderPtr reader) { 31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; 31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *ret; 31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (reader->node == NULL)) 31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode != NULL) 31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->curnode; 31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->node; 31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (node->type) { 31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ELEMENT_NODE: 31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ATTRIBUTE_NODE: 31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node->ns == NULL) || 31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->ns->prefix == NULL)) 31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlStrdup(node->name)); 31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlStrdup(node->ns->prefix); 31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlStrcat(ret, BAD_CAST ":"); 31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlStrcat(ret, node->name); 31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_TEXT_NODE: 31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlStrdup(BAD_CAST "#text")); 31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_CDATA_SECTION_NODE: 31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlStrdup(BAD_CAST "#cdata-section")); 31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ENTITY_NODE: 31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ENTITY_REF_NODE: 31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlStrdup(node->name)); 31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_PI_NODE: 31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlStrdup(node->name)); 31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_COMMENT_NODE: 31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlStrdup(BAD_CAST "#comment")); 31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCUMENT_NODE: 31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_HTML_DOCUMENT_NODE: 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DOCB_ENABLED 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCB_DOCUMENT_NODE: 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlStrdup(BAD_CAST "#document")); 31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCUMENT_FRAG_NODE: 31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlStrdup(BAD_CAST "#document-fragment")); 31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_NOTATION_NODE: 31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlStrdup(node->name)); 31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCUMENT_TYPE_NODE: 31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DTD_NODE: 31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlStrdup(node->name)); 31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_NAMESPACE_DECL: { 31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr ns = (xmlNsPtr) node; 31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlStrdup(BAD_CAST "xmlns"); 31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns->prefix == NULL) 31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlStrcat(ret, BAD_CAST ":"); 31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlStrcat(ret, ns->prefix); 31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ELEMENT_DECL: 31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ATTRIBUTE_DECL: 31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ENTITY_DECL: 31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_XINCLUDE_START: 31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_XINCLUDE_END: 31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderConstName: 31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The qualified name of the node, equal to Prefix :LocalName. 32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the local name or NULL if not available, the string is 32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * deallocated with the reader. 32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const xmlChar * 32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderConstName(xmlTextReaderPtr reader) { 32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; 32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (reader->node == NULL)) 32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode != NULL) 32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->curnode; 32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->node; 32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (node->type) { 32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ELEMENT_NODE: 32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ATTRIBUTE_NODE: 32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node->ns == NULL) || 32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->ns->prefix == NULL)) 32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(node->name); 32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(CONSTQSTR(node->ns->prefix, node->name)); 32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_TEXT_NODE: 32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(CONSTSTR(BAD_CAST "#text")); 32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_CDATA_SECTION_NODE: 32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(CONSTSTR(BAD_CAST "#cdata-section")); 32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ENTITY_NODE: 32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ENTITY_REF_NODE: 32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(CONSTSTR(node->name)); 32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_PI_NODE: 32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(CONSTSTR(node->name)); 32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_COMMENT_NODE: 32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(CONSTSTR(BAD_CAST "#comment")); 32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCUMENT_NODE: 32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_HTML_DOCUMENT_NODE: 32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DOCB_ENABLED 32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCB_DOCUMENT_NODE: 32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(CONSTSTR(BAD_CAST "#document")); 32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCUMENT_FRAG_NODE: 32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(CONSTSTR(BAD_CAST "#document-fragment")); 32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_NOTATION_NODE: 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(CONSTSTR(node->name)); 32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCUMENT_TYPE_NODE: 32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DTD_NODE: 32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(CONSTSTR(node->name)); 32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_NAMESPACE_DECL: { 32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr ns = (xmlNsPtr) node; 32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns->prefix == NULL) 32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(CONSTSTR(BAD_CAST "xmlns")); 32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(CONSTQSTR(BAD_CAST "xmlns", ns->prefix)); 32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ELEMENT_DECL: 32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ATTRIBUTE_DECL: 32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ENTITY_DECL: 32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_XINCLUDE_START: 32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_XINCLUDE_END: 32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderPrefix: 32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A shorthand reference to the namespace associated with the node. 32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the prefix or NULL if not available, 32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if non NULL it need to be freed by the caller. 32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar * 32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderPrefix(xmlTextReaderPtr reader) { 32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; 32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (reader->node == NULL)) 32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode != NULL) 32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->curnode; 32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->node; 32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->type == XML_NAMESPACE_DECL) { 32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr ns = (xmlNsPtr) node; 32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns->prefix == NULL) 32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlStrdup(BAD_CAST "xmlns")); 32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node->type != XML_ELEMENT_NODE) && 32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->type != XML_ATTRIBUTE_NODE)) 32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node->ns != NULL) && (node->ns->prefix != NULL)) 32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlStrdup(node->ns->prefix)); 32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderConstPrefix: 32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A shorthand reference to the namespace associated with the node. 33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the prefix or NULL if not available, the string is deallocated 33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * with the reader. 33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const xmlChar * 33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderConstPrefix(xmlTextReaderPtr reader) { 33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (reader->node == NULL)) 33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode != NULL) 33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->curnode; 33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->node; 33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->type == XML_NAMESPACE_DECL) { 33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr ns = (xmlNsPtr) node; 33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns->prefix == NULL) 33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(CONSTSTR(BAD_CAST "xmlns")); 33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node->type != XML_ELEMENT_NODE) && 33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->type != XML_ATTRIBUTE_NODE)) 33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node->ns != NULL) && (node->ns->prefix != NULL)) 33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(CONSTSTR(node->ns->prefix)); 33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderNamespaceUri: 33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The URI defining the namespace associated with the node. 33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the namespace URI or NULL if not available, 33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if non NULL it need to be freed by the caller. 33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar * 33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderNamespaceUri(xmlTextReaderPtr reader) { 33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; 33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (reader->node == NULL)) 33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode != NULL) 33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->curnode; 33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->node; 33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->type == XML_NAMESPACE_DECL) 33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlStrdup(BAD_CAST "http://www.w3.org/2000/xmlns/")); 33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node->type != XML_ELEMENT_NODE) && 33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->type != XML_ATTRIBUTE_NODE)) 33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->ns != NULL) 33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlStrdup(node->ns->href)); 33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderConstNamespaceUri: 33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The URI defining the namespace associated with the node. 33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the namespace URI or NULL if not available, the string 33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * will be deallocated with the reader 33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const xmlChar * 33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderConstNamespaceUri(xmlTextReaderPtr reader) { 33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; 33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (reader->node == NULL)) 33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode != NULL) 33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->curnode; 33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->node; 33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->type == XML_NAMESPACE_DECL) 33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(CONSTSTR(BAD_CAST "http://www.w3.org/2000/xmlns/")); 33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node->type != XML_ELEMENT_NODE) && 33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->type != XML_ATTRIBUTE_NODE)) 33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->ns != NULL) 33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(CONSTSTR(node->ns->href)); 33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderBaseUri: 33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The base URI of the node. 33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the base URI or NULL if not available, 33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if non NULL it need to be freed by the caller. 33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar * 33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderBaseUri(xmlTextReaderPtr reader) { 33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (reader->node == NULL)) 33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlNodeGetBase(NULL, reader->node)); 33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderConstBaseUri: 34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The base URI of the node. 34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the base URI or NULL if not available, the string 34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * will be deallocated with the reader 34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const xmlChar * 34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderConstBaseUri(xmlTextReaderPtr reader) { 34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *tmp; 34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *ret; 34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (reader->node == NULL)) 34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlNodeGetBase(NULL, reader->node); 34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == NULL) 34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = CONSTSTR(tmp); 34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(tmp); 34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderDepth: 34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The depth of the node in the tree. 34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the depth or -1 in case of error 34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderDepth(xmlTextReaderPtr reader) { 34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) 34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode != NULL) { 34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->curnode->type == XML_ATTRIBUTE_NODE) || 34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->curnode->type == XML_NAMESPACE_DECL)) 34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(reader->depth + 1); 34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(reader->depth + 2); 34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(reader->depth); 34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderHasAttributes: 34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Whether the node has attributes. 34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if true, 0 if false, and -1 in case or error 34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderHasAttributes(xmlTextReaderPtr reader) { 34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; 34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) 34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode != NULL) 34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->curnode; 34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->node; 34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node->type == XML_ELEMENT_NODE) && 34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((node->properties != NULL) || (node->nsDef != NULL))) 34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO: handle the xmlDecl */ 34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderHasValue: 34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Whether the node can have a text value. 34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if true, 0 if false, and -1 in case or error 34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderHasValue(xmlTextReaderPtr reader) { 34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; 34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) 34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode != NULL) 34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->curnode; 34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->node; 34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (node->type) { 34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ATTRIBUTE_NODE: 34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_TEXT_NODE: 34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_CDATA_SECTION_NODE: 35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_PI_NODE: 35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_COMMENT_NODE: 35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_NAMESPACE_DECL: 35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderValue: 35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Provides the text value of the node if present 35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the string or NULL if not available. The result must be deallocated 35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * with xmlFree() 35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar * 35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderValue(xmlTextReaderPtr reader) { 35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; 35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) 35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode != NULL) 35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->curnode; 35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->node; 35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (node->type) { 35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_NAMESPACE_DECL: 35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlStrdup(((xmlNsPtr) node)->href)); 35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ATTRIBUTE_NODE:{ 35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAttrPtr attr = (xmlAttrPtr) node; 35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (attr->parent != NULL) 35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (xmlNodeListGetString 35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (attr->parent->doc, attr->children, 1)); 35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (xmlNodeListGetString(NULL, attr->children, 1)); 35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_TEXT_NODE: 35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_CDATA_SECTION_NODE: 35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_PI_NODE: 35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_COMMENT_NODE: 35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->content != NULL) 35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (xmlStrdup(node->content)); 35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderConstValue: 35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Provides the text value of the node if present 35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the string or NULL if not available. The result will be 35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * deallocated on the next Read() operation. 35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const xmlChar * 35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderConstValue(xmlTextReaderPtr reader) { 35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; 35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) 35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode != NULL) 35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->curnode; 35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->node; 35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (node->type) { 35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_NAMESPACE_DECL: 35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(((xmlNsPtr) node)->href); 35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ATTRIBUTE_NODE:{ 35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAttrPtr attr = (xmlAttrPtr) node; 35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((attr->children != NULL) && 35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (attr->children->type == XML_TEXT_NODE) && 35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (attr->children->next == NULL)) 35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(attr->children->content); 35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->buffer == NULL) 35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->buffer = xmlBufferCreateSize(100); 35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->buffer == NULL) { 35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlTextReaderSetup : malloc failed\n"); 35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->buffer->use = 0; 35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodeBufGetContent(reader->buffer, node); 35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(reader->buffer->content); 35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_TEXT_NODE: 36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_CDATA_SECTION_NODE: 36035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_PI_NODE: 36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_COMMENT_NODE: 36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(node->content); 36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderIsDefault: 36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Whether an Attribute node was generated from the default value 36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * defined in the DTD or schema. 36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if not defaulted, 1 if defaulted, and -1 in case of error 36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderIsDefault(xmlTextReaderPtr reader) { 36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderQuoteChar: 36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The quotation mark character used to enclose the value of an attribute. 36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns " or ' and -1 in case of error 36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderQuoteChar(xmlTextReaderPtr reader) { 36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO maybe lookup the attribute value for " first */ 36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return((int) '"'); 36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderXmlLang: 36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The xml:lang scope within which the node resides. 36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the xml:lang value or NULL if none exists., 36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if non NULL it need to be freed by the caller. 36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar * 36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderXmlLang(xmlTextReaderPtr reader) { 36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) 36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlNodeGetLang(reader->node)); 36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderConstXmlLang: 36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The xml:lang scope within which the node resides. 36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the xml:lang value or NULL if none exists. 36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const xmlChar * 36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderConstXmlLang(xmlTextReaderPtr reader) { 36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *tmp; 36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *ret; 36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) 36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlNodeGetLang(reader->node); 36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == NULL) 36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = CONSTSTR(tmp); 36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(tmp); 36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderConstString: 36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str: the string to intern. 36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get an interned string from the reader, allows for example to 36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * speedup string name comparisons 36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns an interned copy of the string or NULL in case of error. The 36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * string will be deallocated with the reader. 36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const xmlChar * 36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderConstString(xmlTextReaderPtr reader, const xmlChar *str) { 37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(CONSTSTR(str)); 37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderNormalization: 37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The value indicating whether to normalize white space and attribute values. 37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Since attribute value and end of line normalizations are a MUST in the XML 37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * specification only the value true is accepted. The broken bahaviour of 37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * accepting out of range character entities like � is of course not 37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * supported either. 37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 or -1 in case of error. 37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderNormalization(xmlTextReaderPtr reader) { 37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 37265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Extensions to the base APIs * 37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderSetParserProp: 37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @prop: the xmlParserProperties to set 37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: usually 0 or 1 to (de)activate it 37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Change the parser processing behaviour by changing some of its internal 37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * properties. Note that some properties can only be changed before any 37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * read has been done. 37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if the call was successful, or -1 in case of error 37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderSetParserProp(xmlTextReaderPtr reader, int prop, int value) { 37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserProperties p = (xmlParserProperties) prop; 37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserCtxtPtr ctxt; 37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (reader->ctxt == NULL)) 37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt = reader->ctxt; 37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (p) { 37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_PARSER_LOADDTD: 37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value != 0) { 37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->loadsubset == 0) { 37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->mode != XML_TEXTREADER_MODE_INITIAL) 37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 37575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->loadsubset = XML_DETECT_IDS; 37585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 37605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->loadsubset = 0; 37615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_PARSER_DEFAULTATTRS: 37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value != 0) { 37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->loadsubset |= XML_COMPLETE_ATTRS; 37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->loadsubset & XML_COMPLETE_ATTRS) 37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->loadsubset -= XML_COMPLETE_ATTRS; 37695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 37715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_PARSER_VALIDATE: 37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value != 0) { 37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->validate = 1; 37745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->validate = XML_TEXTREADER_VALIDATE_DTD; 37755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 37765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->validate = 0; 37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_PARSER_SUBST_ENTITIES: 37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value != 0) { 37815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->replaceEntities = 1; 37825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->replaceEntities = 0; 37845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 37885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderGetParserProp: 37925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 37935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @prop: the xmlParserProperties to get 37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 37955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Read the parser internal property. 37965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 37975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the value, usually 0 or 1, or -1 in case of error. 37985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 37995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 38005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderGetParserProp(xmlTextReaderPtr reader, int prop) { 38015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserProperties p = (xmlParserProperties) prop; 38025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserCtxtPtr ctxt; 38035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (reader->ctxt == NULL)) 38055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 38065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt = reader->ctxt; 38075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (p) { 38095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_PARSER_LOADDTD: 38105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->loadsubset != 0) || (ctxt->validate != 0)) 38115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 38125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_PARSER_DEFAULTATTRS: 38145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->loadsubset & XML_COMPLETE_ATTRS) 38155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 38165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 38175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_PARSER_VALIDATE: 38185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(reader->validate); 38195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_PARSER_SUBST_ENTITIES: 38205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ctxt->replaceEntities); 38215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 38235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 38275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderGetParserLineNumber: 38285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the user data (XML reader context) 38295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 38305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Provide the line number of the current parsing point. 38315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 38325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns an int or 0 if not available 38335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 38345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 38355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderGetParserLineNumber(xmlTextReaderPtr reader) 38365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 38375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (reader->ctxt == NULL) || 38385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->ctxt->input == NULL)) { 38395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 38405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (reader->ctxt->input->line); 38425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 38455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderGetParserColumnNumber: 38465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the user data (XML reader context) 38475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 38485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Provide the column number of the current parsing point. 38495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 38505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns an int or 0 if not available 38515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 38525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 38535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderGetParserColumnNumber(xmlTextReaderPtr reader) 38545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 38555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (reader->ctxt == NULL) || 38565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->ctxt->input == NULL)) { 38575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 38585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (reader->ctxt->input->col); 38605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 38635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderCurrentNode: 38645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 38655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 38665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Hacking interface allowing to get the xmlNodePtr correponding to the 38675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * current node being accessed by the xmlTextReader. This is dangerous 38685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * because the underlying node may be destroyed on the next Reads. 38695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 38705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the xmlNodePtr or NULL in case of error. 38715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 38725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr 38735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderCurrentNode(xmlTextReaderPtr reader) { 38745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 38755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 38765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode != NULL) 38785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(reader->curnode); 38795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(reader->node); 38805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 38835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderPreserve: 38845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 38855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 38865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This tells the XML Reader to preserve the current node. 38875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The caller must also use xmlTextReaderCurrentDoc() to 38885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * keep an handle on the resulting document once parsing has finished 38895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 38905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the xmlNodePtr or NULL in case of error. 38915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 38925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr 38935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderPreserve(xmlTextReaderPtr reader) { 38945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr cur, parent; 38955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 38975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 38985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode != NULL) 39005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = reader->curnode; 39015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 39025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = reader->node; 39035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) 39045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 39055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->type != XML_DOCUMENT_NODE) && (cur->type != XML_DTD_NODE)) { 39075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->extra |= NODE_IS_PRESERVED; 39085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->extra |= NODE_IS_SPRESERVED; 39095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->preserves++; 39115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent = cur->parent;; 39135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (parent != NULL) { 39145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (parent->type == XML_ELEMENT_NODE) 39155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent->extra |= NODE_IS_PRESERVED; 39165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent = parent->parent; 39175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(cur); 39195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PATTERN_ENABLED 39225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 39235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderPreservePattern: 39245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 39255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @pattern: an XPath subset pattern 39265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @namespaces: the prefix definitions, array of [URI, prefix] or NULL 39275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 39285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This tells the XML Reader to preserve all nodes matched by the 39295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pattern. The caller must also use xmlTextReaderCurrentDoc() to 39305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * keep an handle on the resulting document once parsing has finished 39315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 39325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a positive number in case of success and -1 in case of error 39335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 39345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 39355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderPreservePattern(xmlTextReaderPtr reader, const xmlChar *pattern, 39365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar **namespaces) 39375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 39385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlPatternPtr comp; 39395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (pattern == NULL)) 39415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 39425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) comp = xmlPatterncompile(pattern, reader->dict, 0, namespaces); 39445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp == NULL) 39455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 39465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->patternMax <= 0) { 39485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->patternMax = 4; 39495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->patternTab = (xmlPatternPtr *) xmlMalloc(reader->patternMax * 39505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(reader->patternTab[0])); 39515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->patternTab == NULL) { 39525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "xmlMalloc failed !\n"); 39535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 39545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->patternNr >= reader->patternMax) { 39575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlPatternPtr *tmp; 39585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->patternMax *= 2; 39595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = (xmlPatternPtr *) xmlRealloc(reader->patternTab, 39605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->patternMax * 39615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(reader->patternTab[0])); 39625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == NULL) { 39635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "xmlRealloc failed !\n"); 39645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->patternMax /= 2; 39655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 39665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->patternTab = tmp; 39685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->patternTab[reader->patternNr] = comp; 39705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(reader->patternNr++); 39715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 39735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 39755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderCurrentDoc: 39765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 39775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 39785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Hacking interface allowing to get the xmlDocPtr correponding to the 39795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * current document being accessed by the xmlTextReader. 39805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: as a result of this call, the reader will not destroy the 39815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * associated XML document and calling xmlFreeDoc() on the result 39825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is needed once the reader parsing has finished. 39835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 39845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the xmlDocPtr or NULL in case of error. 39855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 39865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDocPtr 39875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderCurrentDoc(xmlTextReaderPtr reader) { 39885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 39895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 39905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->doc != NULL) 39915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(reader->doc); 39925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->ctxt == NULL) || (reader->ctxt->myDoc == NULL)) 39935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 39945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->preserve = 1; 39965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(reader->ctxt->myDoc); 39975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED 40005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char *xmlTextReaderBuildMessage(const char *msg, va_list ap); 40015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void XMLCDECL 40035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderValidityError(void *ctxt, const char *msg, ...); 40045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void XMLCDECL 40065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderValidityWarning(void *ctxt, const char *msg, ...); 40075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void XMLCDECL 40095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderValidityErrorRelay(void *ctx, const char *msg, ...) 40105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 40115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderPtr reader = (xmlTextReaderPtr) ctx; 40125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *str; 40145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_list ap; 40165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_start(ap, msg); 40185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str = xmlTextReaderBuildMessage(msg, ap); 40195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!reader->errorFunc) { 40205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidityError(ctx, "%s", str); 40215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 40225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->errorFunc(reader->errorFuncArg, str, 40235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_PARSER_SEVERITY_VALIDITY_ERROR, 40245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL /* locator */ ); 40255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (str != NULL) 40275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(str); 40285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_end(ap); 40295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void XMLCDECL 40325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderValidityWarningRelay(void *ctx, const char *msg, ...) 40335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 40345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderPtr reader = (xmlTextReaderPtr) ctx; 40355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *str; 40375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_list ap; 40395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_start(ap, msg); 40415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str = xmlTextReaderBuildMessage(msg, ap); 40425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!reader->errorFunc) { 40435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidityWarning(ctx, "%s", str); 40445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 40455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->errorFunc(reader->errorFuncArg, str, 40465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_PARSER_SEVERITY_VALIDITY_WARNING, 40475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL /* locator */ ); 40485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (str != NULL) 40505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(str); 40515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_end(ap); 40525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 40555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderStructuredError(void *ctxt, xmlErrorPtr error); 40565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 40585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderValidityStructuredRelay(void *userData, xmlErrorPtr error) 40595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 40605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderPtr reader = (xmlTextReaderPtr) userData; 40615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->sErrorFunc) { 40635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->sErrorFunc(reader->errorFuncArg, error); 40645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 40655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderStructuredError(reader, error); 40665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 40695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderRelaxNGSetSchema: 40705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 40715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema: a precompiled RelaxNG schema 40725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 40735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use RelaxNG to validate the document as it is processed. 40745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Activation is only possible before the first Read(). 40755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if @schema is NULL, then RelaxNG validation is desactivated. 40765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @ The @schema should not be freed until the reader is deallocated 40775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or its use has been deactivated. 40785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 40795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case the RelaxNG validation could be (des)activated and 40805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * -1 in case of error. 40815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 40825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 40835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderRelaxNGSetSchema(xmlTextReaderPtr reader, xmlRelaxNGPtr schema) { 40845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 40855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 40865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (schema == NULL) { 40875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->rngSchemas != NULL) { 40885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFree(reader->rngSchemas); 40895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->rngSchemas = NULL; 40905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->rngValidCtxt != NULL) { 40925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); 40935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->rngValidCtxt = NULL; 40945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 40965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->mode != XML_TEXTREADER_MODE_INITIAL) 40985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 40995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->rngSchemas != NULL) { 41005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFree(reader->rngSchemas); 41015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->rngSchemas = NULL; 41025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->rngValidCtxt != NULL) { 41045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); 41055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->rngValidCtxt = NULL; 41065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->rngValidCtxt = xmlRelaxNGNewValidCtxt(schema); 41085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->rngValidCtxt == NULL) 41095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 41105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->errorFunc != NULL) { 41115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGSetValidErrors(reader->rngValidCtxt, 41125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidityErrorRelay, 41135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidityWarningRelay, 41145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 41155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->sErrorFunc != NULL) { 41175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, 41185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidityStructuredRelay, 41195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 41205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->rngValidErrors = 0; 41225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->rngFullNode = NULL; 41235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->validate = XML_TEXTREADER_VALIDATE_RNG; 41245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 41255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 41285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderSetSchema: 41295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 41305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schema: a precompiled Schema schema 41315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 41325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use XSD Schema to validate the document as it is processed. 41335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Activation is only possible before the first Read(). 41345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if @schema is NULL, then Schema validation is desactivated. 41355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @ The @schema should not be freed until the reader is deallocated 41365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or its use has been deactivated. 41375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 41385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case the Schema validation could be (des)activated and 41395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * -1 in case of error. 41405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 41415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 41425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderSetSchema(xmlTextReaderPtr reader, xmlSchemaPtr schema) { 41435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 41445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 41455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (schema == NULL) { 41465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->xsdPlug != NULL) { 41475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaSAXUnplug(reader->xsdPlug); 41485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdPlug = NULL; 41495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->xsdValidCtxt != NULL) { 41515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (! reader->xsdPreserveCtxt) 41525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); 41535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdValidCtxt = NULL; 41545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdPreserveCtxt = 0; 41565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->xsdSchemas != NULL) { 41575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaFree(reader->xsdSchemas); 41585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdSchemas = NULL; 41595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 41615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->mode != XML_TEXTREADER_MODE_INITIAL) 41635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 41645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->xsdPlug != NULL) { 41655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaSAXUnplug(reader->xsdPlug); 41665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdPlug = NULL; 41675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->xsdValidCtxt != NULL) { 41695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (! reader->xsdPreserveCtxt) 41705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); 41715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdValidCtxt = NULL; 41725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdPreserveCtxt = 0; 41745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->xsdSchemas != NULL) { 41755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaFree(reader->xsdSchemas); 41765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdSchemas = NULL; 41775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdValidCtxt = xmlSchemaNewValidCtxt(schema); 41795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->xsdValidCtxt == NULL) { 41805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaFree(reader->xsdSchemas); 41815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdSchemas = NULL; 41825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 41835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdPlug = xmlSchemaSAXPlug(reader->xsdValidCtxt, 41855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &(reader->ctxt->sax), 41865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &(reader->ctxt->userData)); 41875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->xsdPlug == NULL) { 41885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaFree(reader->xsdSchemas); 41895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdSchemas = NULL; 41905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); 41915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdValidCtxt = NULL; 41925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 41935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->errorFunc != NULL) { 41955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaSetValidErrors(reader->xsdValidCtxt, 41965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidityErrorRelay, 41975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidityWarningRelay, 41985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 41995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->sErrorFunc != NULL) { 42015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, 42025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidityStructuredRelay, 42035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 42045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdValidErrors = 0; 42065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->validate = XML_TEXTREADER_VALIDATE_XSD; 42075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 42085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 42115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderRelaxNGValidate: 42125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 42135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @rng: the path to a RelaxNG schema or NULL 42145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 42155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use RelaxNG to validate the document as it is processed. 42165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Activation is only possible before the first Read(). 42175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if @rng is NULL, then RelaxNG validation is deactivated. 42185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 42195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case the RelaxNG validation could be (de)activated and 42205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * -1 in case of error. 42215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 42225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 42235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderRelaxNGValidate(xmlTextReaderPtr reader, const char *rng) { 42245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGParserCtxtPtr ctxt; 42255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 42275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 42285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rng == NULL) { 42305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->rngValidCtxt != NULL) { 42315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); 42325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->rngValidCtxt = NULL; 42335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->rngSchemas != NULL) { 42355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFree(reader->rngSchemas); 42365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->rngSchemas = NULL; 42375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 42395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->mode != XML_TEXTREADER_MODE_INITIAL) 42415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 42425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->rngSchemas != NULL) { 42435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFree(reader->rngSchemas); 42445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->rngSchemas = NULL; 42455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->rngValidCtxt != NULL) { 42475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); 42485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->rngValidCtxt = NULL; 42495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt = xmlRelaxNGNewParserCtxt(rng); 42515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->errorFunc != NULL) { 42525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGSetParserErrors(ctxt, 42535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidityErrorRelay, 42545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidityWarningRelay, 42555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 42565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->sErrorFunc != NULL) { 42585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, 42595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidityStructuredRelay, 42605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 42615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->rngSchemas = xmlRelaxNGParse(ctxt); 42635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFreeParserCtxt(ctxt); 42645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->rngSchemas == NULL) 42655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 42665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->rngValidCtxt = xmlRelaxNGNewValidCtxt(reader->rngSchemas); 42675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->rngValidCtxt == NULL) { 42685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGFree(reader->rngSchemas); 42695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->rngSchemas = NULL; 42705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 42715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->errorFunc != NULL) { 42735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGSetValidErrors(reader->rngValidCtxt, 42745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidityErrorRelay, 42755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidityWarningRelay, 42765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 42775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->sErrorFunc != NULL) { 42795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, 42805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidityStructuredRelay, 42815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 42825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->rngValidErrors = 0; 42845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->rngFullNode = NULL; 42855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->validate = XML_TEXTREADER_VALIDATE_RNG; 42865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 42875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 42905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderSchemaValidateInternal: 42915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 42925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @xsd: the path to a W3C XSD schema or NULL 42935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the XML Schema validation context or NULL 42945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @options: options (not used yet) 42955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 42965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Validate the document as it is processed using XML Schema. 42975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Activation is only possible before the first Read(). 42985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If both @xsd and @ctxt are NULL then XML Schema validation is deactivated. 42995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 43005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case the schemas validation could be (de)activated and 43015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * -1 in case of error. 43025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 43035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 43045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderSchemaValidateInternal(xmlTextReaderPtr reader, 43055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *xsd, 43065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaValidCtxtPtr ctxt, 43075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int options ATTRIBUTE_UNUSED) 43085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 43095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 43105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 43115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((xsd != NULL) && (ctxt != NULL)) 43135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 43145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((xsd != NULL) || (ctxt != NULL)) && 43165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((reader->mode != XML_TEXTREADER_MODE_INITIAL) || 43175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->ctxt == NULL))) 43185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 43195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Cleanup previous validation stuff. */ 43215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->xsdPlug != NULL) { 43225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaSAXUnplug(reader->xsdPlug); 43235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdPlug = NULL; 43245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->xsdValidCtxt != NULL) { 43265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (! reader->xsdPreserveCtxt) 43275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); 43285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdValidCtxt = NULL; 43295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdPreserveCtxt = 0; 43315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->xsdSchemas != NULL) { 43325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaFree(reader->xsdSchemas); 43335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdSchemas = NULL; 43345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((xsd == NULL) && (ctxt == NULL)) { 43375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* We just want to deactivate the validation, so get out. */ 43385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 43395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xsd != NULL) { 43425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaParserCtxtPtr pctxt; 43435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Parse the schema and create validation environment. */ 43445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pctxt = xmlSchemaNewParserCtxt(xsd); 43455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->errorFunc != NULL) { 43465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaSetParserErrors(pctxt, 43475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidityErrorRelay, 43485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidityWarningRelay, 43495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 43505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdSchemas = xmlSchemaParse(pctxt); 43525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaFreeParserCtxt(pctxt); 43535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->xsdSchemas == NULL) 43545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 43555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdValidCtxt = xmlSchemaNewValidCtxt(reader->xsdSchemas); 43565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->xsdValidCtxt == NULL) { 43575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaFree(reader->xsdSchemas); 43585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdSchemas = NULL; 43595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 43605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdPlug = xmlSchemaSAXPlug(reader->xsdValidCtxt, 43625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &(reader->ctxt->sax), 43635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &(reader->ctxt->userData)); 43645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->xsdPlug == NULL) { 43655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaFree(reader->xsdSchemas); 43665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdSchemas = NULL; 43675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); 43685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdValidCtxt = NULL; 43695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 43705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 43725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Use the given validation context. */ 43735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdValidCtxt = ctxt; 43745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdPreserveCtxt = 1; 43755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdPlug = xmlSchemaSAXPlug(reader->xsdValidCtxt, 43765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &(reader->ctxt->sax), 43775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &(reader->ctxt->userData)); 43785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->xsdPlug == NULL) { 43795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdValidCtxt = NULL; 43805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdPreserveCtxt = 0; 43815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 43825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 43855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Redirect the validation context's error channels to use 43865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the reader channels. 43875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: In case the user provides the validation context we 43885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * could make this redirection optional. 43895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 43905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->errorFunc != NULL) { 43915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaSetValidErrors(reader->xsdValidCtxt, 43925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidityErrorRelay, 43935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidityWarningRelay, 43945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 43955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->sErrorFunc != NULL) { 43975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, 43985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidityStructuredRelay, 43995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 44005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xsdValidErrors = 0; 44025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->validate = XML_TEXTREADER_VALIDATE_XSD; 44035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 44045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 44075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderSchemaValidateCtxt: 44085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 44095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the XML Schema validation context or NULL 44105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @options: options (not used yet) 44115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 44125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use W3C XSD schema context to validate the document as it is processed. 44135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Activation is only possible before the first Read(). 44145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If @ctxt is NULL, then XML Schema validation is deactivated. 44155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 44165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case the schemas validation could be (de)activated and 44175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * -1 in case of error. 44185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 44195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 44205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderSchemaValidateCtxt(xmlTextReaderPtr reader, 44215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaValidCtxtPtr ctxt, 44225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int options) 44235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 44245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlTextReaderSchemaValidateInternal(reader, NULL, ctxt, options)); 44255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 44285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderSchemaValidate: 44295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 44305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @xsd: the path to a W3C XSD schema or NULL 44315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 44325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use W3C XSD schema to validate the document as it is processed. 44335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Activation is only possible before the first Read(). 44345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If @xsd is NULL, then XML Schema validation is deactivated. 44355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 44365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case the schemas validation could be (de)activated and 44375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * -1 in case of error. 44385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 44395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 44405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderSchemaValidate(xmlTextReaderPtr reader, const char *xsd) 44415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 44425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlTextReaderSchemaValidateInternal(reader, xsd, NULL, 0)); 44435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 44455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 44475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderIsNamespaceDecl: 44485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 44495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 44505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Determine whether the current node is a namespace declaration 44515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * rather than a regular attribute. 44525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 44535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if the current node is a namespace declaration, 0 if it 44545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is a regular attribute or other type of node, or -1 in case of 44555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * error. 44565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 44575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 44585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderIsNamespaceDecl(xmlTextReaderPtr reader) { 44595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; 44605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 44615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 44625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->node == NULL) 44635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 44645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->curnode != NULL) 44655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->curnode; 44665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 44675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = reader->node; 44685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (XML_NAMESPACE_DECL == node->type) 44705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 44715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 44725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 44735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 44765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderConstXmlVersion: 44775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 44785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 44795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Determine the XML version of the document being read. 44805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 44815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a string containing the XML version of the document or NULL 44825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in case of error. The string is deallocated with the reader. 44835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 44845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const xmlChar * 44855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderConstXmlVersion(xmlTextReaderPtr reader) { 44865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr doc = NULL; 44875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 44885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 44895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->doc != NULL) 44905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = reader->doc; 44915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (reader->ctxt != NULL) 44925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = reader->ctxt->myDoc; 44935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc == NULL) 44945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 44955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc->version == NULL) 44975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 44985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 44995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(CONSTSTR(doc->version)); 45005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 45035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderStandalone: 45045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 45055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Determine the standalone status of the document being read. 45075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if the document was declared to be standalone, 0 if it 45095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * was declared to be not standalone, or -1 if the document did not 45105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * specify its standalone status or in case of error. 45115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 45125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 45135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderStandalone(xmlTextReaderPtr reader) { 45145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr doc = NULL; 45155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 45165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 45175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->doc != NULL) 45185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = reader->doc; 45195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (reader->ctxt != NULL) 45205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = reader->ctxt->myDoc; 45215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc == NULL) 45225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 45235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(doc->standalone); 45255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 45285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 45295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Error Handling Extensions * 45305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 45315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 45325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* helper to build a xmlMalloc'ed string from a format and va_list */ 45345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char * 45355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderBuildMessage(const char *msg, va_list ap) { 45365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size = 0; 45375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int chars; 45385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *larger; 45395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *str = NULL; 45405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_list aq; 45415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (1) { 45435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VA_COPY(aq, ap); 45445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chars = vsnprintf(str, size, msg, aq); 45455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_end(aq); 45465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (chars < 0) { 45475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "vsnprintf failed !\n"); 45485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (str) 45495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(str); 45505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 45515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((chars < size) || (size == MAX_ERR_MSG_SIZE)) 45535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 45545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (chars < MAX_ERR_MSG_SIZE) 45555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size = chars + 1; 45565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 45575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size = MAX_ERR_MSG_SIZE; 45585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((larger = (char *) xmlRealloc(str, size)) == NULL) { 45595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "xmlRealloc failed !\n"); 45605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (str) 45615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(str); 45625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 45635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str = larger; 45655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return str; 45685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 45715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderLocatorLineNumber: 45725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @locator: the xmlTextReaderLocatorPtr used 45735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Obtain the line number for the given locator. 45755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the line number or -1 in case of error. 45775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 45785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 45795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderLocatorLineNumber(xmlTextReaderLocatorPtr locator) { 45805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* we know that locator is a xmlParserCtxtPtr */ 45815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserCtxtPtr ctx = (xmlParserCtxtPtr)locator; 45825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = -1; 45835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (locator == NULL) 45855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 45865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctx->node != NULL) { 45875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlGetLineNo(ctx->node); 45885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 45905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* inspired from error.c */ 45915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserInputPtr input; 45925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input = ctx->input; 45935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((input->filename == NULL) && (ctx->inputNr > 1)) 45945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input = ctx->inputTab[ctx->inputNr - 2]; 45955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input != NULL) { 45965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = input->line; 45975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 45995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 46005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ret; 46045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 46055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 46075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderLocatorBaseURI: 46085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @locator: the xmlTextReaderLocatorPtr used 46095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 46105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Obtain the base URI for the given locator. 46115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 46125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the base URI or NULL in case of error, 46135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if non NULL it need to be freed by the caller. 46145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 46155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar * 46165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderLocatorBaseURI(xmlTextReaderLocatorPtr locator) { 46175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* we know that locator is a xmlParserCtxtPtr */ 46185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserCtxtPtr ctx = (xmlParserCtxtPtr)locator; 46195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *ret = NULL; 46205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (locator == NULL) 46225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 46235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctx->node != NULL) { 46245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlNodeGetBase(NULL,ctx->node); 46255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 46275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* inspired from error.c */ 46285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserInputPtr input; 46295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input = ctx->input; 46305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((input->filename == NULL) && (ctx->inputNr > 1)) 46315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input = ctx->inputTab[ctx->inputNr - 2]; 46325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input != NULL) { 46335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlStrdup(BAD_CAST input->filename); 46345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 46365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = NULL; 46375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ret; 46415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 46425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 46445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderGenericError(void *ctxt, xmlParserSeverities severity, 46455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *str) 46465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 46475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserCtxtPtr ctx = (xmlParserCtxtPtr) ctxt; 46485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderPtr reader = (xmlTextReaderPtr) ctx->_private; 46505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (str != NULL) { 46525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->errorFunc) 46535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->errorFunc(reader->errorFuncArg, str, severity, 46545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlTextReaderLocatorPtr) ctx); 46555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(str); 46565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 46585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 46605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderStructuredError(void *ctxt, xmlErrorPtr error) 46615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 46625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserCtxtPtr ctx = (xmlParserCtxtPtr) ctxt; 46635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderPtr reader = (xmlTextReaderPtr) ctx->_private; 46655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (error && reader->sErrorFunc) { 46675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->sErrorFunc(reader->errorFuncArg, (xmlErrorPtr) error); 46685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 46705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void XMLCDECL 46725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderError(void *ctxt, const char *msg, ...) 46735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 46745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_list ap; 46755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_start(ap, msg); 46775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderGenericError(ctxt, 46785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_PARSER_SEVERITY_ERROR, 46795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderBuildMessage(msg, ap)); 46805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_end(ap); 46815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 46835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void XMLCDECL 46855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderWarning(void *ctxt, const char *msg, ...) 46865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 46875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_list ap; 46885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_start(ap, msg); 46905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderGenericError(ctxt, 46915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_PARSER_SEVERITY_WARNING, 46925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderBuildMessage(msg, ap)); 46935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_end(ap); 46945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 46955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void XMLCDECL 46975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderValidityError(void *ctxt, const char *msg, ...) 46985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 46995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_list ap; 47005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int len = xmlStrlen((const xmlChar *) msg); 47025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((len > 1) && (msg[len - 2] != ':')) { 47045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 47055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * some callbacks only report locator information: 47065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * skip them (mimicking behaviour in error.c) 47075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 47085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_start(ap, msg); 47095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderGenericError(ctxt, 47105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_PARSER_SEVERITY_VALIDITY_ERROR, 47115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderBuildMessage(msg, ap)); 47125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_end(ap); 47135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 47155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void XMLCDECL 47175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderValidityWarning(void *ctxt, const char *msg, ...) 47185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 47195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_list ap; 47205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int len = xmlStrlen((const xmlChar *) msg); 47225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((len != 0) && (msg[len - 1] != ':')) { 47245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 47255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * some callbacks only report locator information: 47265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * skip them (mimicking behaviour in error.c) 47275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 47285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_start(ap, msg); 47295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderGenericError(ctxt, 47305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_PARSER_SEVERITY_VALIDITY_WARNING, 47315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderBuildMessage(msg, ap)); 47325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_end(ap); 47335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 47355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 47375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderSetErrorHandler: 47385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 47395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @f: the callback function to call on error and warnings 47405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @arg: a user argument to pass to the callback function 47415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 47425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Register a callback function that will be called on error and warnings. 47435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 47445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If @f is NULL, the default error and warning handlers are restored. 47455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 47465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 47475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderSetErrorHandler(xmlTextReaderPtr reader, 47485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderErrorFunc f, void *arg) 47495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 47505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (f != NULL) { 47515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->sax->error = xmlTextReaderError; 47525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->sax->serror = NULL; 47535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->vctxt.error = xmlTextReaderValidityError; 47545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->sax->warning = xmlTextReaderWarning; 47555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->vctxt.warning = xmlTextReaderValidityWarning; 47565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->errorFunc = f; 47575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->sErrorFunc = NULL; 47585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->errorFuncArg = arg; 47595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED 47605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->rngValidCtxt) { 47615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGSetValidErrors(reader->rngValidCtxt, 47625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidityErrorRelay, 47635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidityWarningRelay, 47645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 47655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, NULL, 47665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 47675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->xsdValidCtxt) { 47695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaSetValidErrors(reader->xsdValidCtxt, 47705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidityErrorRelay, 47715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidityWarningRelay, 47725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 47735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, NULL, 47745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 47755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 47775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 47785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* restore defaults */ 47795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->sax->error = xmlParserError; 47805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->vctxt.error = xmlParserValidityError; 47815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->sax->warning = xmlParserWarning; 47825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->vctxt.warning = xmlParserValidityWarning; 47835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->errorFunc = NULL; 47845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->sErrorFunc = NULL; 47855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->errorFuncArg = NULL; 47865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED 47875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->rngValidCtxt) { 47885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGSetValidErrors(reader->rngValidCtxt, NULL, NULL, 47895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 47905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, NULL, 47915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 47925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->xsdValidCtxt) { 47945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaSetValidErrors(reader->xsdValidCtxt, NULL, NULL, 47955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 47965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, NULL, 47975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 47985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 48005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 48025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 48045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xmlTextReaderSetStructuredErrorHandler: 48055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 48065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @f: the callback function to call on error and warnings 48075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @arg: a user argument to pass to the callback function 48085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 48095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Register a callback function that will be called on error and warnings. 48105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 48115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If @f is NULL, the default error and warning handlers are restored. 48125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 48135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 48145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderSetStructuredErrorHandler(xmlTextReaderPtr reader, 48155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlStructuredErrorFunc f, void *arg) 48165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 48175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (f != NULL) { 48185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->sax->error = NULL; 48195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->sax->serror = xmlTextReaderStructuredError; 48205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->vctxt.error = xmlTextReaderValidityError; 48215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->sax->warning = xmlTextReaderWarning; 48225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->vctxt.warning = xmlTextReaderValidityWarning; 48235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->sErrorFunc = f; 48245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->errorFunc = NULL; 48255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->errorFuncArg = arg; 48265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED 48275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->rngValidCtxt) { 48285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGSetValidErrors(reader->rngValidCtxt, NULL, NULL, 48295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 48305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, 48315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidityStructuredRelay, 48325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 48335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->xsdValidCtxt) { 48355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaSetValidErrors(reader->xsdValidCtxt, NULL, NULL, 48365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 48375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, 48385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderValidityStructuredRelay, 48395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 48405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 48425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 48435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* restore defaults */ 48445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->sax->error = xmlParserError; 48455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->sax->serror = NULL; 48465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->vctxt.error = xmlParserValidityError; 48475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->sax->warning = xmlParserWarning; 48485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->vctxt.warning = xmlParserValidityWarning; 48495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->errorFunc = NULL; 48505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->sErrorFunc = NULL; 48515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->errorFuncArg = NULL; 48525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED 48535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->rngValidCtxt) { 48545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGSetValidErrors(reader->rngValidCtxt, NULL, NULL, 48555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 48565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, NULL, 48575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 48585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->xsdValidCtxt) { 48605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaSetValidErrors(reader->xsdValidCtxt, NULL, NULL, 48615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 48625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, NULL, 48635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader); 48645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 48665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 48685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 48705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderIsValid: 48715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 48725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 48735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Retrieve the validity status from the parser context 48745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 48755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the flag value 1 if valid, 0 if no, and -1 in case of error 48765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 48775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 48785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderIsValid(xmlTextReaderPtr reader) 48795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 48805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 48815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 48825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED 48835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->validate == XML_TEXTREADER_VALIDATE_RNG) 48845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (reader->rngValidErrors == 0); 48855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->validate == XML_TEXTREADER_VALIDATE_XSD) 48865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (reader->xsdValidErrors == 0); 48875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 48885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->ctxt != NULL) && (reader->ctxt->validate == 1)) 48895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (reader->ctxt->valid); 48905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 48915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 48925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 48945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderGetErrorHandler: 48955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: the xmlTextReaderPtr used 48965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @f: the callback function or NULL is no callback has been registered 48975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @arg: a user argument 48985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 48995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Retrieve the error callback function and user argument. 49005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 49015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 49025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderGetErrorHandler(xmlTextReaderPtr reader, 49035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderErrorFunc * f, void **arg) 49045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 49055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (f != NULL) 49065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *f = reader->errorFunc; 49075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (arg != NULL) 49085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *arg = reader->errorFuncArg; 49095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 49105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 49115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 49125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * New set (2.6.0) of simpler and more flexible APIs * 49135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 49145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 49155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 49175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderSetup: 49185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: an XML reader 49195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @input: xmlParserInputBufferPtr used to feed the reader, will 49205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * be destroyed with it. 49215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URL: the base URL to use for the document 49225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @encoding: the document encoding, or NULL 49235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @options: a combination of xmlParserOption 49245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 49255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Setup an XML reader with new options 49265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 49275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success and -1 in case of error. 49285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 49295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 49305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderSetup(xmlTextReaderPtr reader, 49315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserInputBufferPtr input, const char *URL, 49325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *encoding, int options) 49335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 49345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) { 49355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input != NULL) 49365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeParserInputBuffer(input); 49375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 49385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 49415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * we force the generation of compact text nodes on the reader 49425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * since usr applications should never modify the tree 49435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 49445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) options |= XML_PARSE_COMPACT; 49455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->doc = NULL; 49475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->entNr = 0; 49485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->parserFlags = options; 49495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->validate = XML_TEXTREADER_NOT_VALIDATE; 49505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((input != NULL) && (reader->input != NULL) && 49515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->allocs & XML_TEXTREADER_INPUT)) { 49525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeParserInputBuffer(reader->input); 49535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->input = NULL; 49545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->allocs -= XML_TEXTREADER_INPUT; 49555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input != NULL) { 49575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->input = input; 49585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->allocs |= XML_TEXTREADER_INPUT; 49595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->buffer == NULL) 49615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->buffer = xmlBufferCreateSize(100); 49625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->buffer == NULL) { 49635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 49645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlTextReaderSetup : malloc failed\n"); 49655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 49665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->sax == NULL) 49685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->sax = (xmlSAXHandler *) xmlMalloc(sizeof(xmlSAXHandler)); 49695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->sax == NULL) { 49705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 49715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlTextReaderSetup : malloc failed\n"); 49725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 49735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSAXVersion(reader->sax, 2); 49755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->startElement = reader->sax->startElement; 49765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->sax->startElement = xmlTextReaderStartElement; 49775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->endElement = reader->sax->endElement; 49785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->sax->endElement = xmlTextReaderEndElement; 49795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SAX1_ENABLED 49805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->sax->initialized == XML_SAX2_MAGIC) { 49815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_SAX1_ENABLED */ 49825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->startElementNs = reader->sax->startElementNs; 49835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->sax->startElementNs = xmlTextReaderStartElementNs; 49845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->endElementNs = reader->sax->endElementNs; 49855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->sax->endElementNs = xmlTextReaderEndElementNs; 49865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SAX1_ENABLED 49875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 49885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->startElementNs = NULL; 49895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->endElementNs = NULL; 49905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_SAX1_ENABLED */ 49925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->characters = reader->sax->characters; 49935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->sax->characters = xmlTextReaderCharacters; 49945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->sax->ignorableWhitespace = xmlTextReaderCharacters; 49955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->cdataBlock = reader->sax->cdataBlock; 49965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->sax->cdataBlock = xmlTextReaderCDataBlock; 49975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->mode = XML_TEXTREADER_MODE_INITIAL; 49995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node = NULL; 50005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->curnode = NULL; 50015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input != NULL) { 50025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->input->buffer->use < 4) { 50035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserInputBufferRead(input, 4); 50045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->ctxt == NULL) { 50065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->input->buffer->use >= 4) { 50075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt = xmlCreatePushParserCtxt(reader->sax, NULL, 50085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const char *) reader->input->buffer->content, 4, URL); 50095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->base = 0; 50105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->cur = 4; 50115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 50125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt = 50135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlCreatePushParserCtxt(reader->sax, NULL, NULL, 0, URL); 50145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->base = 0; 50155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->cur = 0; 50165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 50185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserInputPtr inputStream; 50195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserInputBufferPtr buf; 50205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlCharEncoding enc = XML_CHAR_ENCODING_NONE; 50215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlCtxtReset(reader->ctxt); 50235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf = xmlAllocParserInputBuffer(enc); 50245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buf == NULL) return(-1); 50255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inputStream = xmlNewInputStream(reader->ctxt); 50265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (inputStream == NULL) { 50275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeParserInputBuffer(buf); 50285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 50295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URL == NULL) 50325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inputStream->filename = NULL; 50335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 50345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inputStream->filename = (char *) 50355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlCanonicPath((const xmlChar *) URL); 50365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inputStream->buf = buf; 50375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inputStream->base = inputStream->buf->buffer->content; 50385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inputStream->cur = inputStream->buf->buffer->content; 50395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inputStream->end = 50405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &inputStream->buf->buffer->content[inputStream->buf->buffer->use]; 50415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inputPush(reader->ctxt, inputStream); 50435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->cur = 0; 50445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->ctxt == NULL) { 50465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 50475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlTextReaderSetup : malloc failed\n"); 50485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 50495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->dict != NULL) { 50525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->ctxt->dict != NULL) { 50535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->dict != reader->ctxt->dict) { 50545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDictFree(reader->dict); 50555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->dict = reader->ctxt->dict; 50565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 50585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->dict = reader->dict; 50595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 50615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->ctxt->dict == NULL) 50625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->dict = xmlDictCreate(); 50635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->dict = reader->ctxt->dict; 50645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->_private = reader; 50665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->linenumbers = 1; 50675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->dictNames = 1; 50685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 50695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * use the parser dictionnary to allocate all elements and attributes names 50705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 50715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->docdict = 1; 50725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->parseMode = XML_PARSE_READER; 50735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XINCLUDE_ENABLED 50755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->xincctxt != NULL) { 50765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeFreeContext(reader->xincctxt); 50775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xincctxt = NULL; 50785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (options & XML_PARSE_XINCLUDE) { 50805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xinclude = 1; 50815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xinclude_name = xmlDictLookup(reader->dict, XINCLUDE_NODE, -1); 50825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) options -= XML_PARSE_XINCLUDE; 50835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 50845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->xinclude = 0; 50855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->in_xinclude = 0; 50865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 50875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PATTERN_ENABLED 50885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->patternTab == NULL) { 50895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->patternNr = 0; 50905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->patternMax = 0; 50915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (reader->patternNr > 0) { 50935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->patternNr--; 50945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->patternTab[reader->patternNr] != NULL) { 50955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreePattern(reader->patternTab[reader->patternNr]); 50965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->patternTab[reader->patternNr] = NULL; 50975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 51005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (options & XML_PARSE_DTDVALID) 51025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->validate = XML_TEXTREADER_VALIDATE_DTD; 51035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlCtxtUseOptions(reader->ctxt, options); 51055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (encoding != NULL) { 51065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlCharEncodingHandlerPtr hdlr; 51075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hdlr = xmlFindCharEncodingHandler(encoding); 51095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (hdlr != NULL) 51105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSwitchToEncoding(reader->ctxt, hdlr); 51115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((URL != NULL) && (reader->ctxt->input != NULL) && 51135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reader->ctxt->input->filename == NULL)) 51145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->ctxt->input->filename = (char *) 51155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlStrdup((const xmlChar *) URL); 51165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->doc = NULL; 51185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 51205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 51235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextReaderByteConsumed: 51245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: an XML reader 51255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 51265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This function provides the current index of the parser used 51275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * by the reader, relative to the start of the current entity. 51285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This function actually just wraps a call to xmlBytesConsumed() 51295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * for the parser context associated with the reader. 51305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See xmlBytesConsumed() for more information. 51315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 51325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the index in bytes from the beginning of the entity or -1 51335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in case the index could not be computed. 51345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 51355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)long 51365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderByteConsumed(xmlTextReaderPtr reader) { 51375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader == NULL) || (reader->ctxt == NULL)) 51385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 51395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlByteConsumed(reader->ctxt)); 51405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 51445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlReaderWalker: 51455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: a preparsed document 51465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 51475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create an xmltextReader for a preparsed document. 51485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 51495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new reader or NULL in case of error. 51505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 51515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderPtr 51525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlReaderWalker(xmlDocPtr doc) 51535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 51545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderPtr ret; 51555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc == NULL) 51575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 51585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlMalloc(sizeof(xmlTextReader)); 51605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) { 51615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 51625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlNewTextReader : malloc failed\n"); 51635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 51645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(ret, 0, sizeof(xmlTextReader)); 51665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->entNr = 0; 51675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->input = NULL; 51685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->mode = XML_TEXTREADER_MODE_INITIAL; 51695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->node = NULL; 51705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->curnode = NULL; 51715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->base = 0; 51725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->cur = 0; 51735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->allocs = XML_TEXTREADER_CTXT; 51745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->doc = doc; 51755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->state = XML_TEXTREADER_START; 51765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->dict = xmlDictCreate(); 51775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 51785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 51815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlReaderForDoc: 51825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur: a pointer to a zero terminated string 51835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URL: the base URL to use for the document 51845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @encoding: the document encoding, or NULL 51855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @options: a combination of xmlParserOption 51865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 51875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create an xmltextReader for an XML in-memory document. 51885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The parsing flags @options are a combination of xmlParserOption. 51895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 51905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new reader or NULL in case of error. 51915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 51925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderPtr 51935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlReaderForDoc(const xmlChar * cur, const char *URL, const char *encoding, 51945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int options) 51955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 51965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int len; 51975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) 51995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 52005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len = xmlStrlen(cur); 52015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (xmlReaderForMemory 52035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((const char *) cur, len, URL, encoding, options)); 52045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 52075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlReaderForFile: 52085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename: a file or URL 52095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @encoding: the document encoding, or NULL 52105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @options: a combination of xmlParserOption 52115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 52125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse an XML file from the filesystem or the network. 52135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The parsing flags @options are a combination of xmlParserOption. 52145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 52155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new reader or NULL in case of error. 52165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 52175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderPtr 52185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlReaderForFile(const char *filename, const char *encoding, int options) 52195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 52205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderPtr reader; 52215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader = xmlNewTextReaderFilename(filename); 52235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 52245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 52255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderSetup(reader, NULL, NULL, encoding, options); 52265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (reader); 52275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 52305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlReaderForMemory: 52315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buffer: a pointer to a char array 52325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @size: the size of the array 52335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URL: the base URL to use for the document 52345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @encoding: the document encoding, or NULL 52355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @options: a combination of xmlParserOption 52365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 52375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create an xmltextReader for an XML in-memory document. 52385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The parsing flags @options are a combination of xmlParserOption. 52395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 52405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new reader or NULL in case of error. 52415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 52425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderPtr 52435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlReaderForMemory(const char *buffer, int size, const char *URL, 52445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *encoding, int options) 52455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 52465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderPtr reader; 52475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserInputBufferPtr buf; 52485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf = xmlParserInputBufferCreateStatic(buffer, size, 52505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_CHAR_ENCODING_NONE); 52515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buf == NULL) { 52525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 52535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader = xmlNewTextReader(buf, URL); 52555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) { 52565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeParserInputBuffer(buf); 52575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 52585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->allocs |= XML_TEXTREADER_INPUT; 52605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderSetup(reader, NULL, URL, encoding, options); 52615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (reader); 52625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 52655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlReaderForFd: 52665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @fd: an open file descriptor 52675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URL: the base URL to use for the document 52685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @encoding: the document encoding, or NULL 52695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @options: a combination of xmlParserOption 52705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 52715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create an xmltextReader for an XML from a file descriptor. 52725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The parsing flags @options are a combination of xmlParserOption. 52735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE that the file descriptor will not be closed when the 52745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * reader is closed or reset. 52755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 52765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new reader or NULL in case of error. 52775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 52785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderPtr 52795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlReaderForFd(int fd, const char *URL, const char *encoding, int options) 52805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 52815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderPtr reader; 52825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserInputBufferPtr input; 52835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fd < 0) 52855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 52865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE); 52885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input == NULL) 52895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 52905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input->closecallback = NULL; 52915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader = xmlNewTextReader(input, URL); 52925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) { 52935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeParserInputBuffer(input); 52945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 52955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->allocs |= XML_TEXTREADER_INPUT; 52975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderSetup(reader, NULL, URL, encoding, options); 52985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (reader); 52995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 53005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 53025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlReaderForIO: 53035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ioread: an I/O read function 53045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ioclose: an I/O close function 53055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ioctx: an I/O handler 53065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URL: the base URL to use for the document 53075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @encoding: the document encoding, or NULL 53085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @options: a combination of xmlParserOption 53095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 53105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create an xmltextReader for an XML document from I/O functions and source. 53115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The parsing flags @options are a combination of xmlParserOption. 53125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 53135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new reader or NULL in case of error. 53145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 53155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextReaderPtr 53165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlReaderForIO(xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, 53175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *ioctx, const char *URL, const char *encoding, 53185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int options) 53195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 53205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderPtr reader; 53215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserInputBufferPtr input; 53225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ioread == NULL) 53245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 53255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, 53275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_CHAR_ENCODING_NONE); 53285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input == NULL) 53295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 53305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader = xmlNewTextReader(input, URL); 53315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) { 53325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeParserInputBuffer(input); 53335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 53345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->allocs |= XML_TEXTREADER_INPUT; 53365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderSetup(reader, NULL, URL, encoding, options); 53375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (reader); 53385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 53395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 53415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlReaderNewWalker: 53425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: an XML reader 53435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: a preparsed document 53445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 53455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Setup an xmltextReader to parse a preparsed XML document. 53465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This reuses the existing @reader xmlTextReader. 53475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 53485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success and -1 in case of error 53495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 53505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 53515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlReaderNewWalker(xmlTextReaderPtr reader, xmlDocPtr doc) 53525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 53535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc == NULL) 53545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 53555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 53565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 53575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->input != NULL) { 53595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeParserInputBuffer(reader->input); 53605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->ctxt != NULL) { 53625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlCtxtReset(reader->ctxt); 53635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->entNr = 0; 53665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->input = NULL; 53675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->mode = XML_TEXTREADER_MODE_INITIAL; 53685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->node = NULL; 53695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->curnode = NULL; 53705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->base = 0; 53715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->cur = 0; 53725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->allocs = XML_TEXTREADER_CTXT; 53735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->doc = doc; 53745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->state = XML_TEXTREADER_START; 53755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader->dict == NULL) { 53765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((reader->ctxt != NULL) && (reader->ctxt->dict != NULL)) 53775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->dict = reader->ctxt->dict; 53785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 53795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader->dict = xmlDictCreate(); 53805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 53825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 53835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 53855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlReaderNewDoc: 53865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: an XML reader 53875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur: a pointer to a zero terminated string 53885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URL: the base URL to use for the document 53895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @encoding: the document encoding, or NULL 53905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @options: a combination of xmlParserOption 53915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 53925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Setup an xmltextReader to parse an XML in-memory document. 53935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The parsing flags @options are a combination of xmlParserOption. 53945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This reuses the existing @reader xmlTextReader. 53955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 53965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success and -1 in case of error 53975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 53985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 53995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlReaderNewDoc(xmlTextReaderPtr reader, const xmlChar * cur, 54005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *URL, const char *encoding, int options) 54015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 54025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int len; 54045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) 54065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 54075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 54085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 54095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len = xmlStrlen(cur); 54115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (xmlReaderNewMemory(reader, (const char *)cur, len, 54125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URL, encoding, options)); 54135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 54145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 54165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlReaderNewFile: 54175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: an XML reader 54185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @filename: a file or URL 54195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @encoding: the document encoding, or NULL 54205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @options: a combination of xmlParserOption 54215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 54225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse an XML file from the filesystem or the network. 54235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The parsing flags @options are a combination of xmlParserOption. 54245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This reuses the existing @reader xmlTextReader. 54255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 54265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success and -1 in case of error 54275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 54285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 54295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlReaderNewFile(xmlTextReaderPtr reader, const char *filename, 54305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *encoding, int options) 54315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 54325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserInputBufferPtr input; 54335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filename == NULL) 54355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 54365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 54375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 54385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input = 54405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserInputBufferCreateFilename(filename, 54415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_CHAR_ENCODING_NONE); 54425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input == NULL) 54435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 54445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (xmlTextReaderSetup(reader, input, filename, encoding, options)); 54455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 54465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 54485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlReaderNewMemory: 54495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: an XML reader 54505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buffer: a pointer to a char array 54515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @size: the size of the array 54525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URL: the base URL to use for the document 54535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @encoding: the document encoding, or NULL 54545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @options: a combination of xmlParserOption 54555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 54565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Setup an xmltextReader to parse an XML in-memory document. 54575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The parsing flags @options are a combination of xmlParserOption. 54585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This reuses the existing @reader xmlTextReader. 54595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 54605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success and -1 in case of error 54615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 54625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 54635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlReaderNewMemory(xmlTextReaderPtr reader, const char *buffer, int size, 54645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *URL, const char *encoding, int options) 54655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 54665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserInputBufferPtr input; 54675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 54695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 54705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buffer == NULL) 54715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 54725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input = xmlParserInputBufferCreateStatic(buffer, size, 54745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_CHAR_ENCODING_NONE); 54755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input == NULL) { 54765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 54775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (xmlTextReaderSetup(reader, input, URL, encoding, options)); 54795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 54805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 54825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlReaderNewFd: 54835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: an XML reader 54845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @fd: an open file descriptor 54855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URL: the base URL to use for the document 54865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @encoding: the document encoding, or NULL 54875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @options: a combination of xmlParserOption 54885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 54895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Setup an xmltextReader to parse an XML from a file descriptor. 54905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE that the file descriptor will not be closed when the 54915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * reader is closed or reset. 54925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The parsing flags @options are a combination of xmlParserOption. 54935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This reuses the existing @reader xmlTextReader. 54945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 54955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success and -1 in case of error 54965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 54975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 54985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlReaderNewFd(xmlTextReaderPtr reader, int fd, 54995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *URL, const char *encoding, int options) 55005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 55015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserInputBufferPtr input; 55025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fd < 0) 55045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 55055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 55065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 55075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE); 55095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input == NULL) 55105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 55115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input->closecallback = NULL; 55125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (xmlTextReaderSetup(reader, input, URL, encoding, options)); 55135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 55165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlReaderNewIO: 55175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @reader: an XML reader 55185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ioread: an I/O read function 55195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ioclose: an I/O close function 55205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ioctx: an I/O handler 55215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URL: the base URL to use for the document 55225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @encoding: the document encoding, or NULL 55235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @options: a combination of xmlParserOption 55245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 55255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Setup an xmltextReader to parse an XML document from I/O functions 55265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and source. 55275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The parsing flags @options are a combination of xmlParserOption. 55285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This reuses the existing @reader xmlTextReader. 55295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 55305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success and -1 in case of error 55315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 55325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 55335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlReaderNewIO(xmlTextReaderPtr reader, xmlInputReadCallback ioread, 55345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlInputCloseCallback ioclose, void *ioctx, 55355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *URL, const char *encoding, int options) 55365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 55375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserInputBufferPtr input; 55385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ioread == NULL) 55405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 55415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader == NULL) 55425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 55435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, 55455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_CHAR_ENCODING_NONE); 55465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input == NULL) 55475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 55485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (xmlTextReaderSetup(reader, input, URL, encoding, options)); 55495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 55515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 55525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Utilities * 55535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 55545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 55555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef NOT_USED_YET 55565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 55585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlBase64Decode: 55595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @in: the input buffer 55605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inlen: the size of the input (in), the size read from it (out) 55615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @to: the output buffer 55625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @tolen: the size of the output (in), the size written to (out) 55635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 55645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Base64 decoder, reads from @in and save in @to 55655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: tell jody when this is actually exported 55665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 55675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if all the input was consumer, 1 if the Base64 end was reached, 55685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2 if there wasn't enough space on the output or -1 in case of error. 55695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 55705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 55715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBase64Decode(const unsigned char *in, unsigned long *inlen, 55725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char *to, unsigned long *tolen) 55735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 55745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long incur; /* current index in in[] */ 55755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long inblk; /* last block index in in[] */ 55775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long outcur; /* current index in out[] */ 55795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long inmax; /* size of in[] */ 55815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long outmax; /* size of out[] */ 55835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char cur; /* the current value read from in[] */ 55855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char intmp[4], outtmp[4]; /* temporary buffers for the convert */ 55875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nbintmp; /* number of byte in intmp[] */ 55895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int is_ignore; /* cur should be ignored */ 55915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int is_end = 0; /* the end of the base64 was found */ 55935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int retval = 1; 55955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 55975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((in == NULL) || (inlen == NULL) || (to == NULL) || (tolen == NULL)) 55995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 56005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) incur = 0; 56025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inblk = 0; 56035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) outcur = 0; 56045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inmax = *inlen; 56055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) outmax = *tolen; 56065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nbintmp = 0; 56075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (1) { 56095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (incur >= inmax) 56105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 56115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = in[incur++]; 56125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_ignore = 0; 56135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur >= 'A') && (cur <= 'Z')) 56145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur - 'A'; 56155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if ((cur >= 'a') && (cur <= 'z')) 56165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur - 'a' + 26; 56175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if ((cur >= '0') && (cur <= '9')) 56185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur - '0' + 52; 56195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (cur == '+') 56205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = 62; 56215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (cur == '/') 56225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = 63; 56235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (cur == '.') 56245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = 0; 56255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (cur == '=') /*no op , end of the base64 stream */ 56265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_end = 1; 56275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 56285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_ignore = 1; 56295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nbintmp == 0) 56305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inblk = incur; 56315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_ignore) { 56345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nbouttmp = 3; 56355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int is_break = 0; 56375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_end) { 56395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nbintmp == 0) 56405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 56415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((nbintmp == 1) || (nbintmp == 2)) 56425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nbouttmp = 1; 56435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 56445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nbouttmp = 2; 56455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nbintmp = 3; 56465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_break = 1; 56475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) intmp[nbintmp++] = cur; 56495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 56505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if intmp is full, push the 4byte sequence as a 3 byte 56515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * sequence out 56525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 56535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nbintmp == 4) { 56545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nbintmp = 0; 56555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) outtmp[0] = (intmp[0] << 2) | ((intmp[1] & 0x30) >> 4); 56565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) outtmp[1] = 56575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((intmp[1] & 0x0F) << 4) | ((intmp[2] & 0x3C) >> 2); 56585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) outtmp[2] = ((intmp[2] & 0x03) << 6) | (intmp[3] & 0x3F); 56595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (outcur + 3 >= outmax) { 56605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval = 2; 56615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 56625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < nbouttmp; i++) 56655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) to[outcur++] = outtmp[i]; 56665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inblk = incur; 56675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_break) { 56705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval = 0; 56715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 56725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *tolen = outcur; 56775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *inlen = inblk; 56785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (retval); 56795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 56825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Test routine for the xmlBase64Decode function 56835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 56845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0 56855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 56865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)main(int argc, char **argv) 56875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 56885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *input = " VW4 gcGV0 \n aXQgdGVzdCAuCg== "; 56895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char output[100]; 56915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char output2[100]; 56935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char output3[100]; 56955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long inlen = strlen(input); 56975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long outlen = 100; 56995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 57015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long cons, tmp, tmp2, prod; 57035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 57055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Direct 57065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 57075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlBase64Decode(input, &inlen, output, &outlen); 57085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output[outlen] = 0; 57105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("ret: %d, inlen: %ld , outlen: %ld, output: '%s'\n", ret, inlen, 57115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) outlen, output)indent: Standard input:179: Error:Unmatched #endif 57125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles); 57135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 57155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * output chunking 57165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 57175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cons = 0; 57185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prod = 0; 57195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cons < inlen) { 57205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = 5; 57215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp2 = inlen - cons; 57225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("%ld %ld\n", cons, prod); 57245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlBase64Decode(&input[cons], &tmp2, &output2[prod], &tmp); 57255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cons += tmp2; 57265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prod += tmp; 57275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("%ld %ld\n", cons, prod); 57285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output2[outlen] = 0; 57305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("ret: %d, cons: %ld , prod: %ld, output: '%s'\n", ret, cons, 57315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prod, output2); 57325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 57345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * input chunking 57355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 57365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cons = 0; 57375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prod = 0; 57385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cons < inlen) { 57395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = 100 - prod; 57405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp2 = inlen - cons; 57415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp2 > 5) 57425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp2 = 5; 57435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("%ld %ld\n", cons, prod); 57455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlBase64Decode(&input[cons], &tmp2, &output3[prod], &tmp); 57465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cons += tmp2; 57475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prod += tmp; 57485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("%ld %ld\n", cons, prod); 57495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output3[outlen] = 0; 57515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("ret: %d, cons: %ld , prod: %ld, output: '%s'\n", ret, cons, 57525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prod, output3); 57535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 57545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 57565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 57575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* NOT_USED_YET */ 57585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define bottom_xmlreader 57595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "elfgcchack.h" 57605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_READER_ENABLED */ 5761