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 &#0; 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